Script 8 for Kitchel et al.Ā 2024 in prep taxonomic diversity manuscript.

library(nlme)

Attaching package: ā€˜nlme’

The following object is masked from ā€˜package:lme4’:

    lmList

###Predicts annual dissimilarity with annual characteristics, temperature and fishing values

Pull in - region areas (if not already loaded) - region characteristics (if not already loaded); saveRDS(FishGlob_richness_year_survey, file = here::here(ā€œoutputā€,ā€œFishGlob_richness_year_survey.Rdsā€)) - fishing (if not already loaded) - temp (if not already loaded)

#physical area by year
region_area_byyear <- fread(here::here("output","region_area_byyear.csv"))

#merged fishing, temp, dissimilarities
dissimilarities_temp_fishing <- fread(here::here("output","dissimilarities_temp_fishing.csv"))

#combine
dissimilarities_temp_fishing_area <- dissimilarities_temp_fishing[region_area_byyear, on = c("survey_unit","year")]

#only jaccard for these analyses
dissimilarities_temp_fishing_area.jaccard <- dissimilarities_temp_fishing_area[dissimilarity_metric == "jaccard_dissimilarity_total",]

Add in season

#load up julian days
dates_regions <- readRDS(here::here("output","dates_regions.rds"))

#most common season per year
# Function to get the most frequent value
get_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# Apply the function to each group
dates_regions.r <- dates_regions[, .(season = get_mode(season)), by = c("survey_unit","year")]


#merge
dissimilarities_temp_fishing_area.jaccard <- dates_regions.r[dissimilarities_temp_fishing_area.jaccard, on = c("survey_unit","year")]

Pull in palette and name helper

source(here::here("analysis_code","color_links.R"))

Pull in observed trend values

jaccard_total_coefs.r <- fread(here::here("output","jaccard_total_coefs.r.csv"))

Plot fishing and temperature vs.Ā time for all regions

#######TEMPERATURE

#set order by survey unit for plotting
all_surveys <- levels(as.factor(dissimilarities_temp_fishing_area.jaccard$survey_unit))
setorder(dissimilarities_temp_fishing_area.jaccard, survey_unit)

dissimilarities_temp_fishing_area.jaccard[,Survey_Name_Season:=factor(Survey_Name_Season, levels = unique(dissimilarities_temp_fishing_area.jaccard$Survey_Name_Season), ordered = T)]

(sbt_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_1_20, path = here::here("figures"), filename = "temp_time_survey_facet_1_20.jpg", height = 12, width =9)


(sbt_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_21_34, path = here::here("figures"), filename = "sbt_time_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(fishing_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_1_20, path = here::here("figures"), filename = "fishing_time_survey_facet_1_20.jpg", height = 12, width =9)


(fishing_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_21_34, path = here::here("figures"), filename = "fishing_time_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

Plot fishing and temperature vs.Ā dissimilarity for all regions

#####MEAN TEMP
(preds_sbt_mean_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_21_34.jpg", height = 12, width =9)


#####MINIMUM TEMP
(preds_sbt_min_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_min_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(preds_sbt_mean_fishing_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_fishing_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

###Plot number of tows per year per region

tows_year <- unique(dissimilarities_temp_fishing_area.jaccard[,.(survey_unit, haul_id_count_annual, area_km, year, Survey_Name_Season)])

min_haul_density <- min(tows_year$haul_id_count_annual/tows_year$area_km)
max_haul_density <- max(tows_year$haul_id_count_annual/tows_year$area_km)

(tow_density_survey_facet_1_20 <- ggplot(data = tows_year[survey_unit %in% all_surveys[1:20]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_1_20, path = here::here("figures"), filename = "tow_density_survey_facet_1_20.jpg", height = 12, width =9)


(tow_density_survey_facet_21_34 <- ggplot(data = tows_year[survey_unit %in% all_surveys[21:34]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_21_34, path = here::here("figures"), filename = "tow_density_survey_facet_21_34.jpg", height = 12, width =9)

#minimum and maximum dissimilarity value
min_dissimilarity <- min(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)
max_dissimilarity <- max(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)

#how does tow density vary with dissimilarity?
tow_density_dissimilarity_1_20 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_total" & survey_unit %in% all_surveys[1:20]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_1_20, path = here::here("figures"), filename = "tow_density_dissimilarity_1_20.jpg", height = 12, width =9)

tow_density_dissimilarity_21_34 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_total" & survey_unit %in% all_surveys[21:34]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_21_34, path = here::here("figures"), filename = "tow_density_dissimilarity_21_34.jpg", height = 12, width =9)



#Plot all at once?
tow_density_dissimilarity <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_total"]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = Survey_Name_Season), size = 2) +
  scale_color_manual(values = color_link$hex) +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic()

#and by numbers?
result <- dissimilarities_temp_fishing_area.jaccard[, .(max_density = max(haul_id_count_annual/area_km, na.rm = TRUE), 
                 min_density = min(haul_id_count_annual/area_km, na.rm = TRUE)), 
             by = Survey_Name_Season]

result[,range:= max_density-min_density]

ggplot(data = result) +
  geom_point(aes(x = Survey_Name_Season, y = range)) +
  theme_classic() +
  labs(x = "",y = "Range of tow density values in tow/km^2") +
  theme(axis.text.x = element_text(angle = 45, hjust=1))

Dissimilarity by season of sampling

dissimilarities_temp_fishing_area.jaccard[,season := factor(season, levels = c("Spring","Summer","Fall","Winter"))]

ggplot(dissimilarities_temp_fishing_area.jaccard) +
  geom_boxplot(aes(x = season, y = annual_dissimilarity_value)) +
  theme_classic()

###Set up dredge to identify best performing models


options(na.action = "na.fail")

dissimilarity_covariates_dredge.dt <- dissimilarities_temp_fishing_area.jaccard[,.
                  (year, survey_unit,
                    yearly_mean_bypoint_avg, yearly_max_bypoint_avg, yearly_min_bypoint_avg,yearly_seas_bypoint_avg,
                    yearly_mean_bypoint_SD, yearly_max_bypoint_SD, yearly_min_bypoint_SD,yearly_seas_bypoint_SD,
                    yearly_mean_bypoint_avg.s, yearly_max_bypoint_avg.s, yearly_min_bypoint_avg.s,yearly_seas_bypoint_avg.s,
                    annual_dissimilarity_value,
                    haul_id_count_annual,
                    spp_count_annual, depth_annual_avg,
                    depth_annual_range, latitude_annual_avg,
                    latitude_annual_range, area_km, season, summed_tonnes_scaled_byreg)]

#merge in with colors for plotting predictions by survey
dissimilarity_covariates_dredge.dt <- color_link[dissimilarity_covariates_dredge.dt, on = "survey_unit"]

#If NA for any covariate, delete row
View(dissimilarity_covariates_dredge.dt)
#Deleted:
  #Before 1980 and after 2019
  #Gulf of Saint Laurence South (no depth data)
  #No clear SAU match for Rockall Plateau
dissimilarity_covariates_dredge.dt <- dissimilarity_covariates_dredge.dt[complete.cases(dissimilarity_covariates_dredge.dt)]


dissimilarity_covariates_dredge.dt[, yearly_mean_bypoint_avg.scaledacrossall := scale(yearly_mean_bypoint_avg)][, yearly_mean_bypoint_SD.scaledacrossall := scale(yearly_mean_bypoint_SD)][, yearly_min_bypoint_avg.scaledacrossall := scale(yearly_min_bypoint_avg)][, yearly_max_bypoint_avg.scaledacrossall := scale(yearly_max_bypoint_avg)][, yearly_seas_bypoint_avg.scaledacrossall := scale(yearly_seas_bypoint_avg)][,haul_id_count_annual.scaledacrossall := scale(haul_id_count_annual)][,spp_count_annual.scaledacrossall := scale(spp_count_annual)][,depth_annual_avg.scaledacrossall := scale(depth_annual_avg)][,depth_annual_range.scaledacrossall := scale(depth_annual_range)] [,latitude_annual_avg.scaledacrossall := scale(latitude_annual_avg)][,latitude_annual_range.scaledacrossall := scale(latitude_annual_range)][,area_km.scaledacrossall := scale(area_km)]
###Full model
temp + survey_unit + fishing + area + latitude range + latitude average + depth range + depth average + spp count + # of hauls + season + AR for year

For temperature, we will look at: -mean (scaled across all regions) -max (scaled across all regions) -min (scaled across all regions) -seas (scaled across all regions) -SD

Comparing temp variables AND the presence/absence of a temporal autocorrelation term


global_mod_mean_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                           correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

global_mod_mean_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

global_mod_max_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

global_mod_max_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

global_mod_min_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

global_mod_min_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

global_mod_seas_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

global_mod_seas_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

global_mod_SD_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                             data = dissimilarity_covariates_dredge.dt)

global_mod_SD_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                              correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

View(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls))

#build data table to report AICc
global_mod_temp_table <- data.table(
  `Temporal autocorrelation` = c(
    c(rep(F,5),rep(T,5))
  ),
  `Temperature variable` = rep(c(                  
              "Average mean SBT",
              "Average maximum SBT",                        
              "Average minimum SBT",                  
              "Average SBT seasonality",                 
              "SBT SD"),2),
  deltaAICc = signif(min(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2])-AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2],2))

#order by aicc
setorder(global_mod_temp_table,cols = -"deltaAICc")

global_mod_temp_table[,Rank := seq(1,10,by = 1)]

global_mod_sbt_table <- global_mod_temp_table[,.(Rank,`Temporal autocorrelation`,`Temperature variable`, deltaAICc)]

fwrite(global_mod_sbt_table, here::here("output","global_mod_sbt_table.csv"))

Best performing global model includes minimum temperature (centered and scaled) (Still the case as of July 17, 2024)

Now, look at different combinations of all predictors (min temp) using dredge

Global model: global_mod_min_temp

options(na.action = "na.fail") #  prevent fitting sub-models to different datasets
dd <- dredge(global_mod_min_temp_lm)
Fixed term is "(Intercept)"
dd.dt <- data.table(dd)
View(dd)

#only models less than 4 delta AICc (2 models)
dd.dt.2 <- dd.dt[delta <= 2,]

colnames(dd.dt.2)
 [1] "(Intercept)"                                        "area_km.scaledacrossall"                           
 [3] "depth_annual_avg.scaledacrossall"                   "depth_annual_range.scaledacrossall"                
 [5] "haul_id_count_annual.scaledacrossall"               "latitude_annual_avg.scaledacrossall"               
 [7] "latitude_annual_range.scaledacrossall"              "season"                                            
 [9] "spp_count_annual.scaledacrossall"                   "summed_tonnes_scaled_byreg"                        
[11] "survey_unit"                                        "yearly_min_bypoint_avg.scaledacrossall"            
[13] "summed_tonnes_scaled_byreg:survey_unit"             "survey_unit:yearly_min_bypoint_avg.scaledacrossall"
[15] "df"                                                 "logLik"                                            
[17] "AICc"                                               "delta"                                             
[19] "weight"                                            
#in this step, we delete coefficient values because we will pull them back in later when we calculate both SE and coefficients (other than interaction, which we keep here)
dd.dt.2.formatted <- dd.dt.2[,Rank := as.numeric(rownames(dd.dt.2))][,.(Rank,
                                `summed_tonnes_scaled_byreg:survey_unit`,
                                `survey_unit:yearly_min_bypoint_avg.scaledacrossall`,
                                delta,
                                weight, survey_unit, season
                                )]

#add r-squared values
# Iterate through the best models and extract R-squared values
r_squared_values <-list()
for (i in 1:nrow(dd.dt.2.formatted)) {
  summary_data <- summary(get.models(dd, subset = i)[[1]])
  r_squared <- signif(summary_data$r.squared,2)
  r_squared_values <- unlist(c(r_squared_values,r_squared))
}

dd.dt.2.formatted[,"R squared" := r_squared_values]

#empty data table

model_coef_se_fill <- data.table(Rank = as.numeric(), coef_name = as.character(),coef = as.numeric(), se = as.numeric())

for (i in 1:nrow(dd.dt.2.formatted)){
  model_coef_se_single <- data.table(unlist(coefTable(dd,full = T)[[i]]))
  model_coef_se_single[,coef_names := rownames(unlist(coefTable(dd,full = T)[[i]]))]
  model_coef_se_single[,Rank := i]
  
  colnames(model_coef_se_single) <- c("coef","se","df","coef_name","Rank")
  
  #reduce to columns we need
  model_coef_se_single <- model_coef_se_single[,.(Rank, coef_name, coef, se)]
  
  model_coef_se_fill <- rbind(model_coef_se_fill,model_coef_se_single)
}

#format to merge with model rankings and averaged model
model_coef_se_fill[,coef_se := paste0(round(coef,3)," ± ",round(se,3))]

#delete extra columns
model_coef_se_fill <- model_coef_se_fill[,.(Rank,coef_name,coef_se)]

#long to wide
model_coef_se_fill.w <- dcast(model_coef_se_fill, formula = Rank ~ coef_name, value.var = c("coef_se"))

#merge model_coef_se_fill with dd.dt.2.formatted
model_coef_se_AIC <- dd.dt.2.formatted[model_coef_se_fill.w, on = "Rank"]

#model average all models with delta < 4 (8 models)
model_avg_delta4 <-model.avg(dd, subset = delta < 4, fit = T) #NB: The ā€˜subset’ (or ā€˜conditional’) average only   averages over the models where the parameter appears. An alternative, the ā€˜full’ average assumes that a variable is included in every model, but in some models the corresponding coefficient (and its respective variance) is set to zero. Unlike the ā€˜subset average’, it does not have a tendency of biasing the value away from zero. The ā€˜full’ average is a type of shrinkage estimator, and for variables with a weak relationship to the response it is smaller than ā€˜subset’ estimators., fit = T fits the component models again

model_avg_values <- as.data.table(coefTable(model_avg_delta4,fill = T)) # with SE
coef_names <- names(coef(model.avg(dd, subset = delta < 4)))
model_avg_values[,coef_name:=coef_names][,coef:=Estimate][,Estimate:=NULL][,df:=NULL][,se:= `Std. Error`][,`Std. Error` := NULL]

#new column with coef and SE
model_avg_values[,coef_se := paste0(round(coef,3)," ± ",round(se,3))]

#long to wide for model avg
model_avg.wide <- dcast(model_avg_values, formula = . ~ coef_name, value.var = c("coef_se"))

#add rank of "model avg" to table
model_avg.wide[,Rank := "Model avg"]

best_model_sbt_jaccard_table_formatted <- rbind(model_coef_se_AIC, model_avg.wide, fill = T)

#get rid of interaction coefficients
best_model_sbt_jaccard_table_formatted.r <- best_model_sbt_jaccard_table_formatted[,.(Rank,`(Intercept)`,area_km.scaledacrossall,
                                depth_annual_avg.scaledacrossall,
                                depth_annual_range.scaledacrossall,
                                haul_id_count_annual.scaledacrossall,
                                latitude_annual_avg.scaledacrossall,
                                latitude_annual_range.scaledacrossall,
                                spp_count_annual.scaledacrossall,
                                summed_tonnes_scaled_byreg,
                                season,
                                survey_unit,
                                yearly_min_bypoint_avg.scaledacrossall,
                                `summed_tonnes_scaled_byreg:survey_unit`,
                                `survey_unit:yearly_min_bypoint_avg.scaledacrossall`,
                                `R squared`,
                                delta,
                                weight
                                )]

#round to 2 significant figures

#names of numeric columns
numeric_cols <- names(best_model_sbt_jaccard_table_formatted.r)[sapply(best_model_sbt_jaccard_table_formatted.r, is.numeric)]

# Apply signif() only to numeric columns
best_model_sbt_jaccard_table_formatted.r[, (numeric_cols) := lapply(.SD, function(x) if (is.numeric(x)) signif(x, digits = 2) else x), .SDcols = numeric_cols]

#change column names, in caption note that all variables are centered and scaled
colnames(best_model_sbt_jaccard_table_formatted.r) <- c(
"Rank",                                              
"Intercept",                                     
"Area",       #scaled across all                    
"Average depth",                  
"Depth range",                
"Number of tows",     
"Average latitude",               
"Latitude range",             
"Species count",                  
"Relative catch", #scaled within region    
"Season",
"Survey",                                       
"Average minimum temperature",            
"Survey * relative catch",            
"Survey * avg min temperature",
"R squared",
paste0("\u0394"," AICc"),                                             
paste0("\u03C9"))



#save as csv

fwrite(best_model_sbt_jaccard_table_formatted.r,here::here("output","best_model_sbt_jaccard_table_formatted.csv"))

Take aways Dissimilarity increases with increasing avg # tows Dissimilarity decreases with increasing avg latitude Dissimilarity increases with increasing latitude range Dissimilarity increases with increasing fishing effort Dissimilarity decreases with increasing depth range Dissimilarity increases with increasing average depth Dissimilarity increases with increasing area Dissimilarity decreases with increasing minimum temperature Dissimilarity increases with increasing # spp Dissimilarity increases with relative fishing catch

Predict dissimilarity across years using averaged model (model_avg_delta4)

dissimilarity_covariates_dredge.dt_predictions <- copy(dissimilarity_covariates_dredge.dt)

  #allowing temp and fishing to vary (aka no changes)
  dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]] #full allows us to switch back to mixed effect models
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
  
  
  #constant temp in regions (aka take mean of temperature values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]

  #constant fishing in regions (aka take mean of fishing values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)]

#and then with consistent temp and fishing in regions (aka take mean of both min temp and fishing)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)][,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]


#allowing temp and fishing to vary within regs (normal)
    dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := 
                                                     predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[1]]][,pred_se := 
                                                                                                                                                                         predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
#allowing only fishing to vary within regions (with mean temp)
  
   dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,pred_dissim := 
                                                                        predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[1]]][,pred_se :=
                                                                                                                                                                                                              predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
  
#allowing only temperature to vary within regions (with mean fishing pressure)
     
   dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,pred_dissim :=
                                                                           predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg)[[1]]][,pred_se := 
                                                                                                                                                                                                                                  predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
   
#and then with consistent temp and fishing across regions (mean of both fishing and temp)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)][,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]

dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,pred_dissim := 
                                                                         predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg)[[1]]][,pred_se :=
                                                                                                                                                                                                                 predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
#and then with consistent temp and fishing across regions (mean of both fishing and temp)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing <- copy(dissimilarity_covariates_dredge.dt)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg)][,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall)]

dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing[,pred_dissim := 
                                                                         predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing)[[1]]][,pred_se :=
                                                                                                                                                                                                                 predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
#FOR COLOR TO MATCH
#sort color link by survey name season
#alphabetical order
color_link_alpha <- setorder(color_link, survey_unit)

#exclude surveys we don't include
color_link_alpha <- color_link_alpha[survey_unit %in% unique(dissimilarity_covariates_dredge.dt_predictions$survey_unit),]

color_alpha_order <- color_link_alpha[,hex]
label_alpha_order <- color_link_alpha[,Survey_Name_Season]
  

#maintain temp and fishing
#plot
predicted_values_temp_fishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions")

#average temp and fishing for each region
predicted_values_temp_fishing_meantempfishinginsurvey <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions with mean\nsurvey temperature and fishing pressure")

#average temp and fishing across all regions
predicted_values_temp_fishing_meantempfishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.1) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions with mean\novereall temperature and fishing pressure")

#merge plots
predicted_values_sbt_jaccard_fishing_merge <- cowplot::plot_grid(predicted_values_temp_fishing,
                                                 predicted_values_temp_fishing_meantempfishinginsurvey,
                                                 predicted_values_temp_fishing_meantempfishing,
                                                 ncol = 1)
Warning: Removed 27 rows containing missing values (`geom_line()`).Warning: no non-missing arguments to max; returning -InfWarning: no non-missing arguments to max; returning -Inf
ggsave(predicted_values_sbt_jaccard_fishing_merge, path = here::here("figures"), filename = "predicted_values_sbt_jaccard_fishing_merge.jpg", height = 30, width = 14)

Take dissimilarity values from random normal distribution for each year for each region, and then calculate slope (1000 times). Do this for: - Fishing and temperature vary interannually within surveys - Temperature is held constant (as mean over time series for a survey), but fishing varies (allows us to look at relative variance explained) - Fishing is held constant (as mean over time series for a survey), but temperature varies (allows us to look at relative variance explained) - Both fishing and temperature held constant (allows us to see role of other components of the model)

################################################################################
#full predictions
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table <- dissimilarity_covariates_dredge.dt_predictions[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL TO EXTRACT SURVEY SPECIFIC TREND VALUES
  jaccard_total_predicted_lm_singlerun <- lm(rnorm_pred ~ year*survey_unit,data = table)

  model_coefs_reduced_predictions_singlerun <- data.table(summary(jaccard_total_predicted_lm_singlerun)$coefficients)
  model_coefs_reduced_predictions_singlerun[,var := rownames(summary(jaccard_total_predicted_lm_singlerun)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun <- model_coefs_reduced_predictions_singlerun[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun[1,Estimate]
  model_coefs_reduced_predictions_singlerun[1,survey_unit_coefficient := AI_estimate]
  model_coefs_reduced_predictions_singlerun[2:32,survey_unit_coefficient := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns <- rbind(predicted_dissim_trends_rnormruns, model_coefs_reduced_predictions_singlerun[,.(survey_unit, survey_unit_coefficient)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns[,mean_dissim_coef:= mean(survey_unit_coefficient),survey_unit][,sd_dissim := sd(survey_unit_coefficient),.(survey_unit)]

predicted_dissim_trends_rnormruns.summary <- unique(predicted_dissim_trends_rnormruns[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormruns.summary[,pred_type := "full"]

################################################################################
#predictions with temp held constant and fishing still varying from year to year
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttemp <- dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttemp <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttemp[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttemp <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttemp)

  model_coefs_reduced_predictions_singlerun_constanttemp <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttemp[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttemp <- model_coefs_reduced_predictions_singlerun_constanttemp[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttemp[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttemp[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[1,survey_unit_coefficient := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[2:32,survey_unit_coefficient := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttemp <- rbind(predicted_dissim_trends_rnormruns_constanttemp, model_coefs_reduced_predictions_singlerun_constanttemp[,.(survey_unit, survey_unit_coefficient)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttemp[,mean_dissim_coef:= mean(survey_unit_coefficient),survey_unit][,sd_dissim := sd(survey_unit_coefficient),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_temp.summary <- unique(predicted_dissim_trends_rnormruns_constanttemp[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_temp.summary[,pred_type := "temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_temp.summary)

################################################################################
#predictions with fishing held constant (and temperature varying)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constantfishing <- dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constantfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constantfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constantfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constantfishing)

  model_coefs_reduced_predictions_singlerun_constantfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constantfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constantfishing <- model_coefs_reduced_predictions_singlerun_constantfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constantfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constantfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[1,survey_unit_coefficient := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[2:32,survey_unit_coefficient := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constantfishing <- rbind(predicted_dissim_trends_rnormruns_constantfishing, model_coefs_reduced_predictions_singlerun_constantfishing[,.(survey_unit, survey_unit_coefficient)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constantfishing[,mean_dissim_coef:= mean(survey_unit_coefficient),survey_unit][,sd_dissim := sd(survey_unit_coefficient),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_fishing.summary <- unique(predicted_dissim_trends_rnormruns_constantfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_fishing.summary[,pred_type := "fishing_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_fishing.summary)


################################################################################
#predictions with both fishing and temperature held constant (variability goes to other factors we don't account for)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttempfishing <- dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttempfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttempfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttempfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttempfishing)

  model_coefs_reduced_predictions_singlerun_constanttempfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttempfishing <- model_coefs_reduced_predictions_singlerun_constanttempfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttempfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[1,survey_unit_coefficient := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[2:32,survey_unit_coefficient := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttempfishing <- rbind(predicted_dissim_trends_rnormruns_constanttempfishing, model_coefs_reduced_predictions_singlerun_constanttempfishing[,.(survey_unit, survey_unit_coefficient)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttempfishing[,mean_dissim_coef:= mean(survey_unit_coefficient),survey_unit][,sd_dissim := sd(survey_unit_coefficient),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary <- unique(predicted_dissim_trends_rnormruns_constanttempfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary[,pred_type := "fishing_and_temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_tempfishing.summary)

Plotting observed vs predicted


jaccard_fishing_temp_model_observed_predicted_dt <- jaccard_total_coefs.r[predicted_dissim_trends_rnormruns.summary, on = "survey_unit"]

jaccard_fishing_temp_model_observed_predicted_dt[,pred_lower := mean_dissim_coef-sd_dissim][,pred_upper := mean_dissim_coef+sd_dissim]

#FULL MODEL, both temperature and fishing are allowed to vary
jaccard_fishing_temp_model_observed_predicted_lm <- lm(survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"])
summary(jaccard_fishing_temp_model_observed_predicted_lm) #R^2 0.42

Call:
lm(formula = survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "full"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0021802 -0.0005767 -0.0001645  0.0002654  0.0027045 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      4.644e-05  2.091e-04   0.222    0.826    
mean_dissim_coef 1.340e+00  2.150e-01   6.234 7.26e-07 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001181 on 30 degrees of freedom
Multiple R-squared:  0.5644,    Adjusted R-squared:  0.5499 
F-statistic: 38.87 on 1 and 30 DF,  p-value: 7.255e-07
(jaccard_fishing_temp_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = survey_unit_coefficient, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = survey_unit_coefficient, x = mean_dissim_coef)) +
  geom_smooth(aes(y = survey_unit_coefficient, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
  lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n") +
  theme_classic()
)


#fishing constant (fishing constant; temperature varies only)
jaccard_fishing_constant_model_observed_predicted_lm <- lm(survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"])
summary(jaccard_fishing_constant_model_observed_predicted_lm) 

Call:
lm(formula = survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_constant"])

Residuals:
      Min        1Q    Median        3Q       Max 
-0.003854 -0.000737  0.000125  0.001116  0.002460 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -0.0001512  0.0002544  -0.594  0.55673    
mean_dissim_coef  1.7835078  0.4064213   4.388  0.00013 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001397 on 30 degrees of freedom
Multiple R-squared:  0.391, Adjusted R-squared:  0.3707 
F-statistic: 19.26 on 1 and 30 DF,  p-value: 0.0001301
#Temperature as a predictor, not fishing = R^2 = 0.28 (drop in 12% of variance explained when you lose fishing as predictor)

(jaccard_fishing_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = survey_unit_coefficient, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = survey_unit_coefficient, x = mean_dissim_coef)) +
    geom_smooth(aes(y = survey_unit_coefficient, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(temperature varies fishing constant)") +
  theme_classic()
)


#temp constant (fishing only; temperature constant)
jaccard_temperature_constant_model_observed_predicted_lm <- lm(survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"])
summary(jaccard_temperature_constant_model_observed_predicted_lm) #0.18 Drop in 22% of variance explained when you lose temperature as a predictor

Call:
lm(formula = survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0025504 -0.0007330 -0.0001993  0.0003781  0.0042618 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      0.0001688  0.0002728   0.619  0.54082   
mean_dissim_coef 0.8114157  0.2508362   3.235  0.00296 **
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001541 on 30 degrees of freedom
Multiple R-squared:  0.2586,    Adjusted R-squared:  0.2339 
F-statistic: 10.46 on 1 and 30 DF,  p-value: 0.00296
(jaccard_temperature_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = survey_unit_coefficient, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = survey_unit_coefficient, x = mean_dissim_coef)) +
    geom_smooth(aes(y = survey_unit_coefficient, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing varies temperature constant)") +
  theme_classic()
)


#both temperature and fish held constant
jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm <- lm(survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"])
summary(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm) #%11 

Call:
lm(formula = survey_unit_coefficient ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_and_temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0027648 -0.0008501 -0.0002845  0.0008554  0.0037028 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      5.175e-05  2.834e-04   0.183  0.85631   
mean_dissim_coef 1.741e+00  6.291e-01   2.768  0.00956 **
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001597 on 30 degrees of freedom
Multiple R-squared:  0.2035,    Adjusted R-squared:  0.1769 
F-statistic: 7.664 on 1 and 30 DF,  p-value: 0.009563
(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = survey_unit_coefficient, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = survey_unit_coefficient, x = mean_dissim_coef)) +
    geom_smooth(aes(y = survey_unit_coefficient, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm")+
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing and temperature constant)") +
  theme_classic()
)


#merge
jaccard_fishing_sbt_model_observed_predicted_merge <- plot_grid(jaccard_fishing_temp_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_temperature_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")), ncol = 2, labels = c("a.","b.","c.","d."))
`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'
ggsave(jaccard_fishing_sbt_model_observed_predicted_merge, path = here::here("figures"),filename = "jaccard_fishing_sbt_model_observed_predicted_merge.jpg", height =6, width = 8)

NA
NA

Let’s visualize model coefficients with temperature and fishing (similar to figure 2) model_avg_values

model_avg_values


interaction_avg_model_coef <- model_avg_values[c(7,39:101),.(coef_name, coef, se)]

#insert AI
interaction_avg_model_coef[1:2,survey_unit := "AI"][1:2,coef_true := coef][1:2,predictor := c("Relative fishing catch","Minimum temperature")]

#Other summed_tonnes_scaled_byreg
interaction_avg_model_coef[3:33,survey_unit := substr(coef_name, 39, str_length(coef_name))][3:33,coef_true := interaction_avg_model_coef[1,coef_true]+coef][3:33,predictor := "Relative fishing catch"]

#Other yearly_min_bypoint_avg.scaledacrossall
interaction_avg_model_coef[34:64,survey_unit := substr(coef_name, str_length("survey_unit")+1, str_length(coef_name)-str_length("yearly_min_bypoint_avg.scaledacrossall")-1)][34:64,coef_true := interaction_avg_model_coef[2,coef_true]+coef][34:64,predictor := "Minimum temperature"]

#reorder temperature and fishing
interaction_avg_model_coef[,predictor := factor(predictor, levels = c("Minimum temperature","Relative fishing catch"))]

#link for full survey name
interaction_avg_model_coef <- color_link[interaction_avg_model_coef, on = "survey_unit"]

#reorder by survey_unit
interaction_avg_model_coef[,Survey_Name_Season := reorder(Survey_Name_Season, survey_unit, decreasing = TRUE)]
Warning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NAWarning: argument is not numeric or logical: returning NA
#mark significance
interaction_avg_model_coef[,Significant := ifelse((coef_true-se > 0 & coef_true+se > 0) | (coef_true-se < 0 & coef_true+se < 0),T,F)]

Plot all other coefficients in averaged model

model_avg_values.nonfishortemp <- model_avg_values[c(2,6,102:106),]

#mark significance
model_avg_values.nonfishortemp[,Significant := ifelse((coef-se > 0 & coef+se > 0) | (coef-se < 0 & coef+se < 0),T,F)]

#more helpful names for variables
model_avg_values.nonfishortemp[,Variable := c("Area","Species count","Depth","Number of tows","Latitude","Depth range","Latitude range")]

#make factor with order
model_avg_values.nonfishortemp[,Variable := factor(Variable, levels = c("Area","Species count","Number of tows","Depth","Depth range","Latitude","Latitude range"))]


#plot
all_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp, aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp, aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "\n\n\n") +
coord_flip() +
theme_classic()

#plot
all_but_lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#plot
lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#merge into single plot

model_coef_summary_sbt_jaccard <- cowplot::plot_grid(sbt_fishing_avg_model_coef+theme(legend.position = "null", axis.title.x = element_blank()),all_avg_model_coef+theme(legend.position = "null"), ncol = 1, labels = c("  a.                                                      b.","        c."), label_y = 0.99, rel_heights = c(3,1))

ggsave(model_coef_summary_sbt_jaccard, path = here::here("figures"),filename = "model_coef_summary_sbt_jaccard.jpg", height = 6.5, width = 8, unit = "in")

#Show intercepts by region and season


#survey intercepts
survey_intercepts <- model_avg_values[c(1,8:38),.(coef_name, coef, se)]
survey_intercepts[1,survey_unit := "AI"][1,coef_true := coef]
survey_intercepts[2:32,survey_unit := substr(coef_name, 12, str_length(coef_name))][2:32,coef_true := survey_intercepts[1,coef_true]+coef]
survey_intercepts <- color_link[survey_intercepts, on = "survey_unit"]
survey_intercepts[,Survey_Name_Season := reorder(Survey_Name_Season, coef_true)]


#season_intercepts
season_intercepts <- model_avg_values[c(1,3:5),.(coef_name, coef, se)]
season_intercepts[1,season := "Spring"][1,coef_true := coef]
season_intercepts[2:4,season := substr(coef_name, 7, str_length(coef_name))][2:4,coef_true := season_intercepts[1,coef_true]+coef]
season_intercepts[,season := reorder(season, coef_true)]


#survey intercepts
survey_model_coef <- ggplot() +
geom_point(data = survey_intercepts, aes(x = Survey_Name_Season, y = coef_true)) +  
geom_errorbar(data = survey_intercepts, aes(x = Survey_Name_Season, ymin = coef_true-se, ymax = coef_true+se), width = 0) +
scale_x_discrete(limits = rev) +
#  ylim(0.35,1) +
  labs(y = "Intercept", x = "") +
coord_flip() +
theme_classic()
  
#season intercepts
season_model_coef <- ggplot() +
geom_point(data = season_intercepts, aes(x = season, y = coef_true)) +  
geom_errorbar(data = season_intercepts, aes(x = season, ymin = coef_true-se, ymax = coef_true+se), width = 0) +
scale_x_discrete(limits = rev) +
 # ylim(0.35,1) +
  labs(y = "Intercept", x = "") +
coord_flip() +
theme_classic()

#merge into single plot

model_intercept_jaccard <- cowplot::plot_grid(survey_model_coef+theme(axis.title.x = element_blank()),
                                                     season_model_coef, ncol = 1, labels = c("a.","b."), label_y = 0.99, rel_heights = c(3,1), align = "v")

ggsave(model_intercept_jaccard, path = here::here("figures"),filename = "model_intercept_jaccard.jpg", height = 6.5, width = 6.5, unit = "in")
LS0tCnRpdGxlOiAiTW9kZWwgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCB0ZW1wZXJhdHVyZSwgZmlzaGluZywgYW5kIHN1cnZleSBpZGVudGl0eSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogWm/DqyBKLiBLaXRjaGVsCmRhdGU6IE1heSA2LCAyMDI0Ci0tLQoKU2NyaXB0IDggZm9yIEtpdGNoZWwgZXQgYWwuIDIwMjQgaW4gcHJlcCB0YXhvbm9taWMgZGl2ZXJzaXR5IG1hbnVzY3JpcHQuCgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShNdU1JbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkobG1lNCkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KG5sbWUpCmBgYAoKIyMjUHJlZGljdHMgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCBhbm51YWwgY2hhcmFjdGVyaXN0aWNzLCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyB2YWx1ZXMKClB1bGwgaW4KLSByZWdpb24gYXJlYXMgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKLSByZWdpb24gY2hhcmFjdGVyaXN0aWNzIChpZiBub3QgYWxyZWFkeSBsb2FkZWQpOyBzYXZlUkRTKEZpc2hHbG9iX3JpY2huZXNzX3llYXJfc3VydmV5LCBmaWxlID0gaGVyZTo6aGVyZSgib3V0cHV0IiwiRmlzaEdsb2JfcmljaG5lc3NfeWVhcl9zdXJ2ZXkuUmRzIikpCi0gZmlzaGluZyAoaWYgbm90IGFscmVhZHkgbG9hZGVkKQotIHRlbXAgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKCgoKYGBge3J9CiNwaHlzaWNhbCBhcmVhIGJ5IHllYXIKcmVnaW9uX2FyZWFfYnl5ZWFyIDwtIGZyZWFkKGhlcmU6OmhlcmUoIm91dHB1dCIsInJlZ2lvbl9hcmVhX2J5eWVhci5jc3YiKSkKCiNtZXJnZWQgZmlzaGluZywgdGVtcCwgZGlzc2ltaWxhcml0aWVzCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmcgPC0gZnJlYWQoaGVyZTo6aGVyZSgib3V0cHV0IiwiZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZy5jc3YiKSkKCiNjb21iaW5lCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYSA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nW3JlZ2lvbl9hcmVhX2J5eWVhciwgb24gPSBjKCJzdXJ2ZXlfdW5pdCIsInllYXIiKV0KCiNvbmx5IGphY2NhcmQgZm9yIHRoZXNlIGFuYWx5c2VzCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkIDwtIGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYVtkaXNzaW1pbGFyaXR5X21ldHJpYyA9PSAiamFjY2FyZF9kaXNzaW1pbGFyaXR5X3RvdGFsIixdCmBgYAoKQWRkIGluIHNlYXNvbgpgYGB7cn0KI2xvYWQgdXAganVsaWFuIGRheXMKZGF0ZXNfcmVnaW9ucyA8LSByZWFkUkRTKGhlcmU6OmhlcmUoIm91dHB1dCIsImRhdGVzX3JlZ2lvbnMucmRzIikpCgojbW9zdCBjb21tb24gc2Vhc29uIHBlciB5ZWFyCiMgRnVuY3Rpb24gdG8gZ2V0IHRoZSBtb3N0IGZyZXF1ZW50IHZhbHVlCmdldF9tb2RlIDwtIGZ1bmN0aW9uKHgpIHsKICB1eCA8LSB1bmlxdWUoeCkKICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldCn0KCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggZ3JvdXAKZGF0ZXNfcmVnaW9ucy5yIDwtIGRhdGVzX3JlZ2lvbnNbLCAuKHNlYXNvbiA9IGdldF9tb2RlKHNlYXNvbikpLCBieSA9IGMoInN1cnZleV91bml0IiwieWVhciIpXQoKCiNtZXJnZQpkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCA8LSBkYXRlc19yZWdpb25zLnJbZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQsIG9uID0gYygic3VydmV5X3VuaXQiLCJ5ZWFyIildCmBgYAoKIApQdWxsIGluIHBhbGV0dGUgYW5kIG5hbWUgaGVscGVyCmBgYHtyfQpzb3VyY2UoaGVyZTo6aGVyZSgiYW5hbHlzaXNfY29kZSIsImNvbG9yX2xpbmtzLlIiKSkKYGBgCgpQdWxsIGluIG9ic2VydmVkIHRyZW5kIHZhbHVlcwpgYGB7cn0KamFjY2FyZF90b3RhbF9jb2Vmcy5yIDwtIGZyZWFkKGhlcmU6OmhlcmUoIm91dHB1dCIsImphY2NhcmRfdG90YWxfY29lZnMuci5jc3YiKSkKYGBgCgpQbG90IGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZzLiB0aW1lIGZvciBhbGwgcmVnaW9ucwpgYGB7cn0KIyMjIyMjI1RFTVBFUkFUVVJFCgojc2V0IG9yZGVyIGJ5IHN1cnZleSB1bml0IGZvciBwbG90dGluZwphbGxfc3VydmV5cyA8LSBsZXZlbHMoYXMuZmFjdG9yKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkJHN1cnZleV91bml0KSkKc2V0b3JkZXIoZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQsIHN1cnZleV91bml0KQoKZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLFN1cnZleV9OYW1lX1NlYXNvbjo9ZmFjdG9yKFN1cnZleV9OYW1lX1NlYXNvbiwgbGV2ZWxzID0gdW5pcXVlKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkJFN1cnZleV9OYW1lX1NlYXNvbiksIG9yZGVyZWQgPSBUKV0KCihzYnRfdGltZV9zdXJ2ZXlfZmFjZXRfMV8yMCA8LSBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMToyMF0gJiB5ZWFyID4gMTk3OV0pICsKICBsYWJzKHkgPSAiTWVhbiBib3R0b20gdGVtcGVyYXR1cmUgKMuaQykiLCAgeCA9ICJZZWFyIikgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeCA9IHllYXIpLCBhbHBoYSA9IDAuMykgKwogIGdlb21fc21vb3RoKGFlcyh5ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHggPSB5ZWFyKSwgbWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB+IGF4aXNUaWNrcyguLCBsb2cgPSBGQUxTRSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSkKCmdnc2F2ZShzYnRfdGltZV9zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAidGVtcF90aW1lX3N1cnZleV9mYWNldF8xXzIwLmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCihzYnRfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB4ID0gIlllYXIiKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB4ID0geWVhciksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeCA9IHllYXIpLCBtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IH4gYXhpc1RpY2tzKC4sIGxvZyA9IEZBTFNFKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpKQoKZ2dzYXZlKHNidF90aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAic2J0X3RpbWVfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCiMjIyMjIyNGSVNISU5HCgpkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jYyA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtjb21wbGV0ZS5jYXNlcyhkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWddKSxdCgooZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJmaXNoaW5nX3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKKGZpc2hpbmdfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAiZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoKYGBgCgpQbG90IGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZzLiBkaXNzaW1pbGFyaXR5IGZvciBhbGwgcmVnaW9ucwpgYGB7cn0KIyMjIyNNRUFOIFRFTVAKKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1lYW4gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJwcmVkc19zYnRfbWVhbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgojIyMjI01JTklNVU0gVEVNUAoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNaW5pbXVtIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21pbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIG1ldGhvZCA9ICJsbSIpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkgKwogIHRoZW1lX2NsYXNzaWMoKSkKCmdnc2F2ZShwcmVkc19zYnRfbWluX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNCA8LSBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1pbmltdW0gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9taW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBhbHBoYSA9IDAuMykgKwogIGdlb21fc21vb3RoKGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKIyMjIyMjI0ZJU0hJTkcKCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkLmNjIDwtIGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW2NvbXBsZXRlLmNhc2VzKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZ10pLF0KCihwcmVkc19zYnRfbWVhbl9maXNoaW5nX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9tZWFuX2Zpc2hpbmdfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCgpgYGAKCiMjI1Bsb3QgbnVtYmVyIG9mIHRvd3MgcGVyIHllYXIgcGVyIHJlZ2lvbgpgYGB7cn0KdG93c195ZWFyIDwtIHVuaXF1ZShkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssLihzdXJ2ZXlfdW5pdCwgaGF1bF9pZF9jb3VudF9hbm51YWwsIGFyZWFfa20sIHllYXIsIFN1cnZleV9OYW1lX1NlYXNvbildKQoKbWluX2hhdWxfZGVuc2l0eSA8LSBtaW4odG93c195ZWFyJGhhdWxfaWRfY291bnRfYW5udWFsL3Rvd3NfeWVhciRhcmVhX2ttKQptYXhfaGF1bF9kZW5zaXR5IDwtIG1heCh0b3dzX3llYXIkaGF1bF9pZF9jb3VudF9hbm51YWwvdG93c195ZWFyJGFyZWFfa20pCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSB0b3dzX3llYXJbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXV0pICsKICBsYWJzKHggPSAiWWVhciIsICB5ID0gZXhwcmVzc2lvbigiVG93IGRlbnNpdHkgKHRvd3MgcGVyIGttIl4yKiIpIikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0geWVhciwgeSA9IGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pKSArCiAgeWxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0IDwtIGdncGxvdChkYXRhID0gdG93c195ZWFyW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdXSkgKwogIGxhYnMoeCA9ICJZZWFyIiwgIHkgPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSkpICsKICB5bGltKGMobWluX2hhdWxfZGVuc2l0eS0wLjAwMDEsIG1heF9oYXVsX2RlbnNpdHkrMC4wMDAxKSkgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKI21pbmltdW0gYW5kIG1heGltdW0gZGlzc2ltaWxhcml0eSB2YWx1ZQptaW5fZGlzc2ltaWxhcml0eSA8LSBtaW4oZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQkYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpCm1heF9kaXNzaW1pbGFyaXR5IDwtIG1heChkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkKCiNob3cgZG9lcyB0b3cgZGVuc2l0eSB2YXJ5IHdpdGggZGlzc2ltaWxhcml0eT8KdG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwIDwtIAogIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbZGlzc2ltaWxhcml0eV9tZXRyaWMgPT0gImphY2NhcmRfZGlzc2ltaWxhcml0eV90b3RhbCIgJiBzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSAoaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDIpICsKICB2aXJpZGlzOjpzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgbmNvbCA9IDQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24oIlRvdyBkZW5zaXR5ICh0b3dzIHBlciBrbSJeMioiKSIpLCB5ID0gIs6yLWRpdmVyc2l0eSIsIGNvbG9yID0gIlllYXIiKSArCiAgICMgeGxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICAgIyB5bGltKGMobWluX2Rpc3NpbWlsYXJpdHktMC4wMSxtYXhfZGlzc2ltaWxhcml0eSswLjAxKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpCgpnZ3NhdmUodG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9kaXNzaW1pbGFyaXR5XzFfMjAuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKdG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8yMV8zNCA8LSAKICBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW2Rpc3NpbWlsYXJpdHlfbWV0cmljID09ICJqYWNjYXJkX2Rpc3NpbWlsYXJpdHlfdG90YWwiICYgc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1syMTozNF1dKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IChoYXVsX2lkX2NvdW50X2FubnVhbC9hcmVhX2ttKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMikgKwogIHZpcmlkaXM6OnNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBuY29sID0gNCwgc2NhbGVzID0gImZyZWUiKSArCiAgbGFicyh4ID0gZXhwcmVzc2lvbigiVG93IGRlbnNpdHkgKHRvd3MgcGVyIGttIl4yKiIpIiksIHkgPSAizrItZGl2ZXJzaXR5IiwgY29sb3IgPSAiWWVhciIpICsKICAgIyB4bGltKGMobWluX2hhdWxfZGVuc2l0eS0wLjAwMDEsIG1heF9oYXVsX2RlbnNpdHkrMC4wMDAxKSkgKwogICAjIHlsaW0oYyhtaW5fZGlzc2ltaWxhcml0eS0wLjAxLG1heF9kaXNzaW1pbGFyaXR5KzAuMDEpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkKCmdnc2F2ZSh0b3dfZGVuc2l0eV9kaXNzaW1pbGFyaXR5XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9kaXNzaW1pbGFyaXR5XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCgojUGxvdCBhbGwgYXQgb25jZT8KdG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eSA8LSAKICBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW2Rpc3NpbWlsYXJpdHlfbWV0cmljID09ICJqYWNjYXJkX2Rpc3NpbWlsYXJpdHlfdG90YWwiXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSAoaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBTdXJ2ZXlfTmFtZV9TZWFzb24pLCBzaXplID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9saW5rJGhleCkgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24oIlRvdyBkZW5zaXR5ICh0b3dzIHBlciBrbSJeMioiKSIpLCB5ID0gIs6yLWRpdmVyc2l0eSIsIGNvbG9yID0gIlllYXIiKSArCiAgICMgeGxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICAgIyB5bGltKGMobWluX2Rpc3NpbWlsYXJpdHktMC4wMSxtYXhfZGlzc2ltaWxhcml0eSswLjAxKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKI2FuZCBieSBudW1iZXJzPwpyZXN1bHQgPC0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLCAuKG1heF9kZW5zaXR5ID0gbWF4KGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgICAgIG1pbl9kZW5zaXR5ID0gbWluKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSkpLCAKICAgICAgICAgICAgIGJ5ID0gU3VydmV5X05hbWVfU2Vhc29uXQoKcmVzdWx0WyxyYW5nZTo9IG1heF9kZW5zaXR5LW1pbl9kZW5zaXR5XQoKZ2dwbG90KGRhdGEgPSByZXN1bHQpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5ID0gcmFuZ2UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIix5ID0gIlJhbmdlIG9mIHRvdyBkZW5zaXR5IHZhbHVlcyBpbiB0b3cva21eMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkKCmBgYAoKRGlzc2ltaWxhcml0eSBieSBzZWFzb24gb2Ygc2FtcGxpbmcKYGBge3J9CmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxzZWFzb24gOj0gZmFjdG9yKHNlYXNvbiwgbGV2ZWxzID0gYygiU3ByaW5nIiwiU3VtbWVyIiwiRmFsbCIsIldpbnRlciIpKV0KCmdncGxvdChkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCkgKwogIGdlb21fYm94cGxvdChhZXMoeCA9IHNlYXNvbiwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCgoKIyMjU2V0IHVwIGRyZWRnZSB0byBpZGVudGlmeSBiZXN0IHBlcmZvcm1pbmcgbW9kZWxzCmBgYHtyfQoKb3B0aW9ucyhuYS5hY3Rpb24gPSAibmEuZmFpbCIpCgpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0IDwtIGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWywuCiAgICAgICAgICAgICAgICAgICh5ZWFyLCBzdXJ2ZXlfdW5pdCwKICAgICAgICAgICAgICAgICAgICB5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZywgeWVhcmx5X21heF9ieXBvaW50X2F2ZywgeWVhcmx5X21pbl9ieXBvaW50X2F2Zyx5ZWFybHlfc2Vhc19ieXBvaW50X2F2ZywKICAgICAgICAgICAgICAgICAgICB5ZWFybHlfbWVhbl9ieXBvaW50X1NELCB5ZWFybHlfbWF4X2J5cG9pbnRfU0QsIHllYXJseV9taW5fYnlwb2ludF9TRCx5ZWFybHlfc2Vhc19ieXBvaW50X1NELAogICAgICAgICAgICAgICAgICAgIHllYXJseV9tZWFuX2J5cG9pbnRfYXZnLnMsIHllYXJseV9tYXhfYnlwb2ludF9hdmcucywgeWVhcmx5X21pbl9ieXBvaW50X2F2Zy5zLHllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnMsCiAgICAgICAgICAgICAgICAgICAgYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwsCiAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbCwgZGVwdGhfYW5udWFsX2F2ZywKICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2UsIGxhdGl0dWRlX2FubnVhbF9hdmcsCiAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLCBhcmVhX2ttLCBzZWFzb24sIHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnKV0KCiNtZXJnZSBpbiB3aXRoIGNvbG9ycyBmb3IgcGxvdHRpbmcgcHJlZGljdGlvbnMgYnkgc3VydmV5CmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQgPC0gY29sb3JfbGlua1tkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0LCBvbiA9ICJzdXJ2ZXlfdW5pdCJdCgojSWYgTkEgZm9yIGFueSBjb3ZhcmlhdGUsIGRlbGV0ZSByb3cKVmlldyhkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQojRGVsZXRlZDoKICAjQmVmb3JlIDE5ODAgYW5kIGFmdGVyIDIwMTkKICAjR3VsZiBvZiBTYWludCBMYXVyZW5jZSBTb3V0aCAobm8gZGVwdGggZGF0YSkKICAjTm8gY2xlYXIgU0FVIG1hdGNoIGZvciBSb2NrYWxsIFBsYXRlYXUKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCA8LSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W2NvbXBsZXRlLmNhc2VzKGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpXQoKCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbLCB5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tZWFuX2J5cG9pbnRfU0Quc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tZWFuX2J5cG9pbnRfU0QpXVssIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9taW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tYXhfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tYXhfYnlwb2ludF9hdmcpXVssIHllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZSh5ZWFybHlfc2Vhc19ieXBvaW50X2F2ZyldWyxoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoaGF1bF9pZF9jb3VudF9hbm51YWwpXVssc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoc3BwX2NvdW50X2FubnVhbCldWyxkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShkZXB0aF9hbm51YWxfYXZnKV1bLGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoZGVwdGhfYW5udWFsX3JhbmdlKV0gWyxsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShsYXRpdHVkZV9hbm51YWxfYXZnKV1bLGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUobGF0aXR1ZGVfYW5udWFsX3JhbmdlKV1bLGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKGFyZWFfa20pXQoKCmBgYAoKIyMjRnVsbCBtb2RlbAp+IHRlbXAgKyBzdXJ2ZXlfdW5pdCArIGZpc2hpbmcgKyBhcmVhICsgbGF0aXR1ZGUgcmFuZ2UgKyBsYXRpdHVkZSBhdmVyYWdlICsgZGVwdGggcmFuZ2UgKyBkZXB0aCBhdmVyYWdlICsgc3BwIGNvdW50ICsgIyBvZiBoYXVscyArIHNlYXNvbiArIEFSIGZvciB5ZWFyCgpGb3IgdGVtcGVyYXR1cmUsIHdlIHdpbGwgbG9vayBhdDoKLW1lYW4gKHNjYWxlZCBhY3Jvc3MgYWxsIHJlZ2lvbnMpCi1tYXggIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotbWluIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotc2VhcyAgKHNjYWxlZCBhY3Jvc3MgYWxsIHJlZ2lvbnMpCi1TRAoKQ29tcGFyaW5nIHRlbXAgdmFyaWFibGVzIEFORCB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiBhIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbiB0ZXJtCmBgYHtyIGZpdCBnbG9iYWwgbW9kfQoKZ2xvYmFsX21vZF9tZWFuX3RlbXBfZ2xzIDwtIGdscyhhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9tZWFuX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgpnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9tZWFuX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9tYXhfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCmdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzIDwtZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21heF9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCmdsb2JhbF9tb2RfbWluX3RlbXBfbG0gPC0gbG0oYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgpnbG9iYWxfbW9kX21pbl90ZW1wX2dscyA8LWdscyhhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgpnbG9iYWxfbW9kX3NlYXNfdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKZ2xvYmFsX21vZF9zZWFzX3RlbXBfZ2xzIDwtIGdscyhhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgpnbG9iYWxfbW9kX1NEX3RlbXBfbG0gPC0gbG0oYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWVhbl9ieXBvaW50X1NELnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCmdsb2JhbF9tb2RfU0RfdGVtcF9nbHMgPC0gZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21lYW5fYnlwb2ludF9TRC5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgpWaWV3KEFJQ2MoZ2xvYmFsX21vZF9tZWFuX3RlbXBfbG0sIGdsb2JhbF9tb2RfbWF4X3RlbXBfbG0sIGdsb2JhbF9tb2RfbWluX3RlbXBfbG0sIGdsb2JhbF9tb2Rfc2Vhc190ZW1wX2xtLCBnbG9iYWxfbW9kX1NEX3RlbXBfbG0sCiAgICAgICAgICBnbG9iYWxfbW9kX21lYW5fdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzLCBnbG9iYWxfbW9kX21pbl90ZW1wX2dscywgZ2xvYmFsX21vZF9zZWFzX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX1NEX3RlbXBfZ2xzKSkKCiNidWlsZCBkYXRhIHRhYmxlIHRvIHJlcG9ydCBBSUNjCmdsb2JhbF9tb2RfdGVtcF90YWJsZSA8LSBkYXRhLnRhYmxlKAogIGBUZW1wb3JhbCBhdXRvY29ycmVsYXRpb25gID0gYygKICAgIGMocmVwKEYsNSkscmVwKFQsNSkpCiAgKSwKICBgVGVtcGVyYXR1cmUgdmFyaWFibGVgID0gcmVwKGMoICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIkF2ZXJhZ2UgbWVhbiBTQlQiLAogICAgICAgICAgICAgICJBdmVyYWdlIG1heGltdW0gU0JUIiwgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAiQXZlcmFnZSBtaW5pbXVtIFNCVCIsICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIkF2ZXJhZ2UgU0JUIHNlYXNvbmFsaXR5IiwgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICJTQlQgU0QiKSwyKSwKICBkZWx0YUFJQ2MgPSBzaWduaWYobWluKEFJQ2MoZ2xvYmFsX21vZF9tZWFuX3RlbXBfbG0sIGdsb2JhbF9tb2RfbWF4X3RlbXBfbG0sIGdsb2JhbF9tb2RfbWluX3RlbXBfbG0sIGdsb2JhbF9tb2Rfc2Vhc190ZW1wX2xtLCBnbG9iYWxfbW9kX1NEX3RlbXBfbG0sCiAgICAgICAgICBnbG9iYWxfbW9kX21lYW5fdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzLCBnbG9iYWxfbW9kX21pbl90ZW1wX2dscywgZ2xvYmFsX21vZF9zZWFzX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX1NEX3RlbXBfZ2xzKVssMl0pLUFJQ2MoZ2xvYmFsX21vZF9tZWFuX3RlbXBfbG0sIGdsb2JhbF9tb2RfbWF4X3RlbXBfbG0sIGdsb2JhbF9tb2RfbWluX3RlbXBfbG0sIGdsb2JhbF9tb2Rfc2Vhc190ZW1wX2xtLCBnbG9iYWxfbW9kX1NEX3RlbXBfbG0sCiAgICAgICAgICBnbG9iYWxfbW9kX21lYW5fdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzLCBnbG9iYWxfbW9kX21pbl90ZW1wX2dscywgZ2xvYmFsX21vZF9zZWFzX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX1NEX3RlbXBfZ2xzKVssMl0sMikpCgojb3JkZXIgYnkgYWljYwpzZXRvcmRlcihnbG9iYWxfbW9kX3RlbXBfdGFibGUsY29scyA9IC0iZGVsdGFBSUNjIikKCmdsb2JhbF9tb2RfdGVtcF90YWJsZVssUmFuayA6PSBzZXEoMSwxMCxieSA9IDEpXQoKZ2xvYmFsX21vZF9zYnRfdGFibGUgPC0gZ2xvYmFsX21vZF90ZW1wX3RhYmxlWywuKFJhbmssYFRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbmAsYFRlbXBlcmF0dXJlIHZhcmlhYmxlYCwgZGVsdGFBSUNjKV0KCmZ3cml0ZShnbG9iYWxfbW9kX3NidF90YWJsZSwgaGVyZTo6aGVyZSgib3V0cHV0IiwiZ2xvYmFsX21vZF9zYnRfdGFibGUuY3N2IikpCgpgYGAKCkJlc3QgcGVyZm9ybWluZyBnbG9iYWwgbW9kZWwgaW5jbHVkZXMgbWluaW11bSB0ZW1wZXJhdHVyZSAoY2VudGVyZWQgYW5kIHNjYWxlZCkgKFN0aWxsIHRoZSBjYXNlIGFzIG9mIEp1bHkgMTcsIDIwMjQpCgpOb3csIGxvb2sgYXQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhbGwgcHJlZGljdG9ycyAobWluIHRlbXApIHVzaW5nIGRyZWRnZQoKR2xvYmFsIG1vZGVsOiBnbG9iYWxfbW9kX21pbl90ZW1wCgpgYGB7cn0Kb3B0aW9ucyhuYS5hY3Rpb24gPSAibmEuZmFpbCIpICMgIHByZXZlbnQgZml0dGluZyBzdWItbW9kZWxzIHRvIGRpZmZlcmVudCBkYXRhc2V0cwpkZCA8LSBkcmVkZ2UoZ2xvYmFsX21vZF9taW5fdGVtcF9sbSkKZGQuZHQgPC0gZGF0YS50YWJsZShkZCkKVmlldyhkZCkKCiNvbmx5IG1vZGVscyBsZXNzIHRoYW4gNCBkZWx0YSBBSUNjICgyIG1vZGVscykKZGQuZHQuMiA8LSBkZC5kdFtkZWx0YSA8PSAyLF0KCmNvbG5hbWVzKGRkLmR0LjIpCgojaW4gdGhpcyBzdGVwLCB3ZSBkZWxldGUgY29lZmZpY2llbnQgdmFsdWVzIGJlY2F1c2Ugd2Ugd2lsbCBwdWxsIHRoZW0gYmFjayBpbiBsYXRlciB3aGVuIHdlIGNhbGN1bGF0ZSBib3RoIFNFIGFuZCBjb2VmZmljaWVudHMgKG90aGVyIHRoYW4gaW50ZXJhY3Rpb24sIHdoaWNoIHdlIGtlZXAgaGVyZSkKZGQuZHQuMi5mb3JtYXR0ZWQgPC0gZGQuZHQuMlssUmFuayA6PSBhcy5udW1lcmljKHJvd25hbWVzKGRkLmR0LjIpKV1bLC4oUmFuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6c3VydmV5X3VuaXRgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzdXJ2ZXlfdW5pdDp5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0LCBzdXJ2ZXlfdW5pdCwgc2Vhc29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0KCiNhZGQgci1zcXVhcmVkIHZhbHVlcwojIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmVzdCBtb2RlbHMgYW5kIGV4dHJhY3QgUi1zcXVhcmVkIHZhbHVlcwpyX3NxdWFyZWRfdmFsdWVzIDwtbGlzdCgpCmZvciAoaSBpbiAxOm5yb3coZGQuZHQuMi5mb3JtYXR0ZWQpKSB7CiAgc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnkoZ2V0Lm1vZGVscyhkZCwgc3Vic2V0ID0gaSlbWzFdXSkKICByX3NxdWFyZWQgPC0gc2lnbmlmKHN1bW1hcnlfZGF0YSRyLnNxdWFyZWQsMikKICByX3NxdWFyZWRfdmFsdWVzIDwtIHVubGlzdChjKHJfc3F1YXJlZF92YWx1ZXMscl9zcXVhcmVkKSkKfQoKZGQuZHQuMi5mb3JtYXR0ZWRbLCJSIHNxdWFyZWQiIDo9IHJfc3F1YXJlZF92YWx1ZXNdCgojZW1wdHkgZGF0YSB0YWJsZQoKbW9kZWxfY29lZl9zZV9maWxsIDwtIGRhdGEudGFibGUoUmFuayA9IGFzLm51bWVyaWMoKSwgY29lZl9uYW1lID0gYXMuY2hhcmFjdGVyKCksY29lZiA9IGFzLm51bWVyaWMoKSwgc2UgPSBhcy5udW1lcmljKCkpCgpmb3IgKGkgaW4gMTpucm93KGRkLmR0LjIuZm9ybWF0dGVkKSl7CiAgbW9kZWxfY29lZl9zZV9zaW5nbGUgPC0gZGF0YS50YWJsZSh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSkKICBtb2RlbF9jb2VmX3NlX3NpbmdsZVssY29lZl9uYW1lcyA6PSByb3duYW1lcyh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSldCiAgbW9kZWxfY29lZl9zZV9zaW5nbGVbLFJhbmsgOj0gaV0KICAKICBjb2xuYW1lcyhtb2RlbF9jb2VmX3NlX3NpbmdsZSkgPC0gYygiY29lZiIsInNlIiwiZGYiLCJjb2VmX25hbWUiLCJSYW5rIikKICAKICAjcmVkdWNlIHRvIGNvbHVtbnMgd2UgbmVlZAogIG1vZGVsX2NvZWZfc2Vfc2luZ2xlIDwtIG1vZGVsX2NvZWZfc2Vfc2luZ2xlWywuKFJhbmssIGNvZWZfbmFtZSwgY29lZiwgc2UpXQogIAogIG1vZGVsX2NvZWZfc2VfZmlsbCA8LSByYmluZChtb2RlbF9jb2VmX3NlX2ZpbGwsbW9kZWxfY29lZl9zZV9zaW5nbGUpCn0KCiNmb3JtYXQgdG8gbWVyZ2Ugd2l0aCBtb2RlbCByYW5raW5ncyBhbmQgYXZlcmFnZWQgbW9kZWwKbW9kZWxfY29lZl9zZV9maWxsWyxjb2VmX3NlIDo9IHBhc3RlMChyb3VuZChjb2VmLDMpLCIgwrEgIixyb3VuZChzZSwzKSldCgojZGVsZXRlIGV4dHJhIGNvbHVtbnMKbW9kZWxfY29lZl9zZV9maWxsIDwtIG1vZGVsX2NvZWZfc2VfZmlsbFssLihSYW5rLGNvZWZfbmFtZSxjb2VmX3NlKV0KCiNsb25nIHRvIHdpZGUKbW9kZWxfY29lZl9zZV9maWxsLncgPC0gZGNhc3QobW9kZWxfY29lZl9zZV9maWxsLCBmb3JtdWxhID0gUmFuayB+IGNvZWZfbmFtZSwgdmFsdWUudmFyID0gYygiY29lZl9zZSIpKQoKI21lcmdlIG1vZGVsX2NvZWZfc2VfZmlsbCB3aXRoIGRkLmR0LjIuZm9ybWF0dGVkCm1vZGVsX2NvZWZfc2VfQUlDIDwtIGRkLmR0LjIuZm9ybWF0dGVkW21vZGVsX2NvZWZfc2VfZmlsbC53LCBvbiA9ICJSYW5rIl0KCiNtb2RlbCBhdmVyYWdlIGFsbCBtb2RlbHMgd2l0aCBkZWx0YSA8IDQgKDggbW9kZWxzKQptb2RlbF9hdmdfZGVsdGE0IDwtbW9kZWwuYXZnKGRkLCBzdWJzZXQgPSBkZWx0YSA8IDQsIGZpdCA9IFQpICNOQjogVGhlIOKAmHN1YnNldOKAmSAob3Ig4oCYY29uZGl0aW9uYWzigJkpIGF2ZXJhZ2Ugb25seSAgIGF2ZXJhZ2VzIG92ZXIgdGhlIG1vZGVscyB3aGVyZSB0aGUgcGFyYW1ldGVyIGFwcGVhcnMuIEFuIGFsdGVybmF0aXZlLCB0aGUg4oCYZnVsbOKAmSBhdmVyYWdlIGFzc3VtZXMgdGhhdCBhIHZhcmlhYmxlIGlzIGluY2x1ZGVkIGluIGV2ZXJ5IG1vZGVsLCBidXQgaW4gc29tZSBtb2RlbHMgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgKGFuZCBpdHMgcmVzcGVjdGl2ZSB2YXJpYW5jZSkgaXMgc2V0IHRvIHplcm8uIFVubGlrZSB0aGUg4oCYc3Vic2V0IGF2ZXJhZ2XigJksIGl0IGRvZXMgbm90IGhhdmUgYSB0ZW5kZW5jeSBvZiBiaWFzaW5nIHRoZSB2YWx1ZSBhd2F5IGZyb20gemVyby4gVGhlIOKAmGZ1bGzigJkgYXZlcmFnZSBpcyBhIHR5cGUgb2Ygc2hyaW5rYWdlIGVzdGltYXRvciwgYW5kIGZvciB2YXJpYWJsZXMgd2l0aCBhIHdlYWsgcmVsYXRpb25zaGlwIHRvIHRoZSByZXNwb25zZSBpdCBpcyBzbWFsbGVyIHRoYW4g4oCYc3Vic2V04oCZIGVzdGltYXRvcnMuLCBmaXQgPSBUIGZpdHMgdGhlIGNvbXBvbmVudCBtb2RlbHMgYWdhaW4KCm1vZGVsX2F2Z192YWx1ZXMgPC0gYXMuZGF0YS50YWJsZShjb2VmVGFibGUobW9kZWxfYXZnX2RlbHRhNCxmaWxsID0gVCkpICMgd2l0aCBTRQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwuYXZnKGRkLCBzdWJzZXQgPSBkZWx0YSA8IDQpKSkKbW9kZWxfYXZnX3ZhbHVlc1ssY29lZl9uYW1lOj1jb2VmX25hbWVzXVssY29lZjo9RXN0aW1hdGVdWyxFc3RpbWF0ZTo9TlVMTF1bLGRmOj1OVUxMXVssc2U6PSBgU3RkLiBFcnJvcmBdWyxgU3RkLiBFcnJvcmAgOj0gTlVMTF0KCiNuZXcgY29sdW1uIHdpdGggY29lZiBhbmQgU0UKbW9kZWxfYXZnX3ZhbHVlc1ssY29lZl9zZSA6PSBwYXN0ZTAocm91bmQoY29lZiwzKSwiIMKxICIscm91bmQoc2UsMykpXQoKI2xvbmcgdG8gd2lkZSBmb3IgbW9kZWwgYXZnCm1vZGVsX2F2Zy53aWRlIDwtIGRjYXN0KG1vZGVsX2F2Z192YWx1ZXMsIGZvcm11bGEgPSAuIH4gY29lZl9uYW1lLCB2YWx1ZS52YXIgPSBjKCJjb2VmX3NlIikpCgojYWRkIHJhbmsgb2YgIm1vZGVsIGF2ZyIgdG8gdGFibGUKbW9kZWxfYXZnLndpZGVbLFJhbmsgOj0gIk1vZGVsIGF2ZyJdCgpiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZCA8LSByYmluZChtb2RlbF9jb2VmX3NlX0FJQywgbW9kZWxfYXZnLndpZGUsIGZpbGwgPSBUKQoKI2dldCByaWQgb2YgaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzCmJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLnIgPC0gYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWRbLC4oUmFuayxgKEludGVyY2VwdClgLGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZzpzdXJ2ZXlfdW5pdGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHN1cnZleV91bml0OnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUiBzcXVhcmVkYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXQoKI3JvdW5kIHRvIDIgc2lnbmlmaWNhbnQgZmlndXJlcwoKI25hbWVzIG9mIG51bWVyaWMgY29sdW1ucwpudW1lcmljX2NvbHMgPC0gbmFtZXMoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucilbc2FwcGx5KGJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLnIsIGlzLm51bWVyaWMpXQoKIyBBcHBseSBzaWduaWYoKSBvbmx5IHRvIG51bWVyaWMgY29sdW1ucwpiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5yWywgKG51bWVyaWNfY29scykgOj0gbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkgaWYgKGlzLm51bWVyaWMoeCkpIHNpZ25pZih4LCBkaWdpdHMgPSAyKSBlbHNlIHgpLCAuU0Rjb2xzID0gbnVtZXJpY19jb2xzXQoKI2NoYW5nZSBjb2x1bW4gbmFtZXMsIGluIGNhcHRpb24gbm90ZSB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIGNlbnRlcmVkIGFuZCBzY2FsZWQKY29sbmFtZXMoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucikgPC0gYygKIlJhbmsiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIkludGVyY2VwdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoiQXJlYSIsICAgICAgICNzY2FsZWQgYWNyb3NzIGFsbCAgICAgICAgICAgICAgICAgICAgCiJBdmVyYWdlIGRlcHRoIiwgICAgICAgICAgICAgICAgICAKIkRlcHRoIHJhbmdlIiwgICAgICAgICAgICAgICAgCiJOdW1iZXIgb2YgdG93cyIsICAgICAKIkF2ZXJhZ2UgbGF0aXR1ZGUiLCAgICAgICAgICAgICAgIAoiTGF0aXR1ZGUgcmFuZ2UiLCAgICAgICAgICAgICAKIlNwZWNpZXMgY291bnQiLCAgICAgICAgICAgICAgICAgIAoiUmVsYXRpdmUgY2F0Y2giLCAjc2NhbGVkIHdpdGhpbiByZWdpb24gICAgCiJTZWFzb24iLAoiU3VydmV5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIkF2ZXJhZ2UgbWluaW11bSB0ZW1wZXJhdHVyZSIsICAgICAgICAgICAgCiJTdXJ2ZXkgKiByZWxhdGl2ZSBjYXRjaCIsICAgICAgICAgICAgCiJTdXJ2ZXkgKiBhdmcgbWluIHRlbXBlcmF0dXJlIiwKIlIgc3F1YXJlZCIsCnBhc3RlMCgiXHUwMzk0IiwiIEFJQ2MiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKcGFzdGUwKCJcdTAzQzkiKSkKCgoKI3NhdmUgYXMgY3N2Cgpmd3JpdGUoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucixoZXJlOjpoZXJlKCJvdXRwdXQiLCJiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5jc3YiKSkKYGBgCgoKVGFrZSBhd2F5cwpEaXNzaW1pbGFyaXR5IGluY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgYXZnICMgdG93cwpEaXNzaW1pbGFyaXR5IGRlY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgYXZnIGxhdGl0dWRlCkRpc3NpbWlsYXJpdHkgaW5jcmVhc2VzIHdpdGggaW5jcmVhc2luZyBsYXRpdHVkZSByYW5nZQpEaXNzaW1pbGFyaXR5IGluY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgZmlzaGluZyBlZmZvcnQKRGlzc2ltaWxhcml0eSBkZWNyZWFzZXMgd2l0aCBpbmNyZWFzaW5nIGRlcHRoIHJhbmdlCkRpc3NpbWlsYXJpdHkgaW5jcmVhc2VzIHdpdGggaW5jcmVhc2luZyBhdmVyYWdlIGRlcHRoCkRpc3NpbWlsYXJpdHkgaW5jcmVhc2VzIHdpdGggaW5jcmVhc2luZyBhcmVhCkRpc3NpbWlsYXJpdHkgIGRlY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgbWluaW11bSB0ZW1wZXJhdHVyZQpEaXNzaW1pbGFyaXR5IGluY3JlYXNlcyB3aXRoIGluY3JlYXNpbmcgIyBzcHAKRGlzc2ltaWxhcml0eSBpbmNyZWFzZXMgd2l0aCByZWxhdGl2ZSBmaXNoaW5nIGNhdGNoCgoKClByZWRpY3QgZGlzc2ltaWxhcml0eSBhY3Jvc3MgeWVhcnMgdXNpbmcgYXZlcmFnZWQgbW9kZWwgKG1vZGVsX2F2Z19kZWx0YTQpCmBgYHtyfQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiAgI2FsbG93aW5nIHRlbXAgYW5kIGZpc2hpbmcgdG8gdmFyeSAoYWthIG5vIGNoYW5nZXMpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc1sscHJlZF9kaXNzaW0gOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzFdXV1bLHByZWRfc2UgOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzJdXV0gI2Z1bGwgYWxsb3dzIHVzIHRvIHN3aXRjaCBiYWNrIHRvIG1peGVkIGVmZmVjdCBtb2RlbHMKICAKICAKICAKICAjY29uc3RhbnQgdGVtcCBpbiByZWdpb25zIChha2EgdGFrZSBtZWFuIG9mIHRlbXBlcmF0dXJlIHZhbHVlcyB3aXRoaW4gc3VydmV5IHVuaXRzIHNvIHRoZXkgYXJlIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiBlYWNoIHllYXIgZm9yIGEgc3VydmV5KQogIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZyA8LSBjb3B5KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWyx5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbDo9bWVhbih5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCksLihzdXJ2ZXlfdW5pdCldCgogICNjb25zdGFudCBmaXNoaW5nIGluIHJlZ2lvbnMgKGFrYSB0YWtlIG1lYW4gb2YgZmlzaGluZyB2YWx1ZXMgd2l0aGluIHN1cnZleSB1bml0cyBzbyB0aGV5IGFyZSB0aGUgc2FtZSB2YWx1ZSB3aXRoaW4gZWFjaCB5ZWFyIGZvciBhIHN1cnZleSkKICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWcgPC0gY29weShkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQogIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZ1ssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6PW1lYW4oc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcpLC4oc3VydmV5X3VuaXQpXQoKI2FuZCB0aGVuIHdpdGggY29uc2lzdGVudCB0ZW1wIGFuZCBmaXNoaW5nIGluIHJlZ2lvbnMgKGFrYSB0YWtlIG1lYW4gb2YgYm90aCBtaW4gdGVtcCBhbmQgZmlzaGluZykKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZyA8LSBjb3B5KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWdbLHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnOj1tZWFuKHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnKSwuKHN1cnZleV91bml0KV1bLHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsOj1tZWFuKHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsKSwuKHN1cnZleV91bml0KV0KCgojYWxsb3dpbmcgdGVtcCBhbmQgZmlzaGluZyB0byB2YXJ5IHdpdGhpbiByZWdzIChub3JtYWwpCiAgICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zWyxwcmVkX2Rpc3NpbSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zKVtbMV1dXVsscHJlZF9zZSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnMpW1syXV1dCiAgCiNhbGxvd2luZyBvbmx5IGZpc2hpbmcgdG8gdmFyeSB3aXRoaW4gcmVnaW9ucyAod2l0aCBtZWFuIHRlbXApCiAgCiAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZ1sscHJlZF9kaXNzaW0gOj0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWcpW1sxXV1dWyxwcmVkX3NlIDo9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZylbWzJdXV0KCiAgCiAgCiNhbGxvd2luZyBvbmx5IHRlbXBlcmF0dXJlIHRvIHZhcnkgd2l0aGluIHJlZ2lvbnMgKHdpdGggbWVhbiBmaXNoaW5nIHByZXNzdXJlKQogICAgIAogICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWdbLHByZWRfZGlzc2ltIDo9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWcpW1sxXV1dWyxwcmVkX3NlIDo9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZylbWzJdXV0KICAgCiNhbmQgdGhlbiB3aXRoIGNvbnNpc3RlbnQgdGVtcCBhbmQgZmlzaGluZyBhY3Jvc3MgcmVnaW9ucyAobWVhbiBvZiBib3RoIGZpc2hpbmcgYW5kIHRlbXApCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWcgPC0gY29weShkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnWyxzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZzo9bWVhbihzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyksLihzdXJ2ZXlfdW5pdCldWyx5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbDo9bWVhbih5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCksLihzdXJ2ZXlfdW5pdCldCgpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnWyxwcmVkX2Rpc3NpbSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnKVtbMV1dXVsscHJlZF9zZSA6PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnKVtbMl1dXQoKCiNhbmQgdGhlbiB3aXRoIGNvbnNpc3RlbnQgdGVtcCBhbmQgZmlzaGluZyBhY3Jvc3MgcmVnaW9ucyAobWVhbiBvZiBib3RoIGZpc2hpbmcgYW5kIHRlbXApCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5nIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdbLHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnOj1tZWFuKHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnKV1bLHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsOj1tZWFuKHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsKV0KCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5nWyxwcmVkX2Rpc3NpbSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZylbWzFdXV1bLHByZWRfc2UgOj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmcpW1syXV1dCgojRk9SIENPTE9SIFRPIE1BVENICiNzb3J0IGNvbG9yIGxpbmsgYnkgc3VydmV5IG5hbWUgc2Vhc29uCiNhbHBoYWJldGljYWwgb3JkZXIKY29sb3JfbGlua19hbHBoYSA8LSBzZXRvcmRlcihjb2xvcl9saW5rLCBzdXJ2ZXlfdW5pdCkKCiNleGNsdWRlIHN1cnZleXMgd2UgZG9uJ3QgaW5jbHVkZQpjb2xvcl9saW5rX2FscGhhIDwtIGNvbG9yX2xpbmtfYWxwaGFbc3VydmV5X3VuaXQgJWluJSB1bmlxdWUoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucyRzdXJ2ZXlfdW5pdCksXQoKY29sb3JfYWxwaGFfb3JkZXIgPC0gY29sb3JfbGlua19hbHBoYVssaGV4XQpsYWJlbF9hbHBoYV9vcmRlciA8LSBjb2xvcl9saW5rX2FscGhhWyxTdXJ2ZXlfTmFtZV9TZWFzb25dCiAgCgojbWFpbnRhaW4gdGVtcCBhbmQgZmlzaGluZwojcGxvdApwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZyA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucykgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHByZWRfZGlzc2ltLCBjb2xvciA9IHN1cnZleV91bml0KSkgKwogIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiAgeWxpbSgwLDEuNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyIpCgojYXZlcmFnZSB0ZW1wIGFuZCBmaXNoaW5nIGZvciBlYWNoIHJlZ2lvbgpwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZ19tZWFudGVtcGZpc2hpbmdpbnN1cnZleSA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZykgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHByZWRfZGlzc2ltLCBjb2xvciA9IHN1cnZleV91bml0KSkgKwogIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiAgeWxpbSgwLDEuNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyB3aXRoIG1lYW5cbnN1cnZleSB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBwcmVzc3VyZSIpCgojYXZlcmFnZSB0ZW1wIGFuZCBmaXNoaW5nIGFjcm9zcyBhbGwgcmVnaW9ucwpwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZ19tZWFudGVtcGZpc2hpbmcgPC0gZ2dwbG90KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5nKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXIsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gcHJlZF9kaXNzaW0sIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiAgZ2VvbV9yaWJib24oYWVzKHggPSB5ZWFyLCB5bWluID0gcHJlZF9kaXNzaW0tcHJlZF9zZSwgeW1heCA9IHByZWRfZGlzc2ltK3ByZWRfc2UsIGZpbGwgPSBzdXJ2ZXlfdW5pdCksIGFscGhhID0gMC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfYWxwaGFfb3JkZXIsIGxhYmVscyA9IGxhYmVsX2FscGhhX29yZGVyLCBuYW1lID0gIlN1cnZleSIpICsKICBsYWJzKHggPSAiWWVhciIseSA9ICJBdmVyYWdlIGFubnVhbCB0b3RhbFxuQnJheSBDdXJ0aXMgZGlzc2ltaWxhcml0eSIpICsKICB5bGltKDAsMS41KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZ3RpdGxlKCJBdmVyYWdlIG1vZGVsIHByZWRpY3Rpb25zIHdpdGggbWVhblxub3ZlcmVhbGwgdGVtcGVyYXR1cmUgYW5kIGZpc2hpbmcgcHJlc3N1cmUiKQoKI21lcmdlIHBsb3RzCnByZWRpY3RlZF92YWx1ZXNfc2J0X2phY2NhcmRfZmlzaGluZ19tZXJnZSA8LSBjb3dwbG90OjpwbG90X2dyaWQocHJlZGljdGVkX3ZhbHVlc190ZW1wX2Zpc2hpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZ19tZWFudGVtcGZpc2hpbmdpbnN1cnZleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF92YWx1ZXNfdGVtcF9maXNoaW5nX21lYW50ZW1wZmlzaGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxKQoKZ2dzYXZlKHByZWRpY3RlZF92YWx1ZXNfc2J0X2phY2NhcmRfZmlzaGluZ19tZXJnZSwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZGljdGVkX3ZhbHVlc19zYnRfamFjY2FyZF9maXNoaW5nX21lcmdlLmpwZyIsIGhlaWdodCA9IDMwLCB3aWR0aCA9IDE0KQpgYGAKClRha2UgZGlzc2ltaWxhcml0eSB2YWx1ZXMgZnJvbSByYW5kb20gbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCB5ZWFyIGZvciBlYWNoIHJlZ2lvbiwgYW5kIHRoZW4gY2FsY3VsYXRlIHNsb3BlICgxMDAwIHRpbWVzKS4gRG8gdGhpcyBmb3I6CiAtIEZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZhcnkgaW50ZXJhbm51YWxseSB3aXRoaW4gc3VydmV5cwogLSBUZW1wZXJhdHVyZSBpcyBoZWxkIGNvbnN0YW50IChhcyBtZWFuIG92ZXIgdGltZSBzZXJpZXMgZm9yIGEgc3VydmV5KSwgYnV0IGZpc2hpbmcgdmFyaWVzIChhbGxvd3MgdXMgdG8gbG9vayBhdCByZWxhdGl2ZSB2YXJpYW5jZSBleHBsYWluZWQpCiAtIEZpc2hpbmcgaXMgaGVsZCBjb25zdGFudCAoYXMgbWVhbiBvdmVyIHRpbWUgc2VyaWVzIGZvciBhIHN1cnZleSksIGJ1dCB0ZW1wZXJhdHVyZSB2YXJpZXMgKGFsbG93cyB1cyB0byBsb29rIGF0IHJlbGF0aXZlIHZhcmlhbmNlIGV4cGxhaW5lZCkKIC0gQm90aCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSBoZWxkIGNvbnN0YW50IChhbGxvd3MgdXMgdG8gc2VlIHJvbGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgbW9kZWwpCiAKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiNmdWxsIHByZWRpY3Rpb25zCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGUgPC0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc1ssLihzdXJ2ZXlfdW5pdCwgcHJlZF9kaXNzaW0sIHByZWRfc2UsIHllYXIpXQojMCkgbWFrZSBkYXRhdGFibGUgdG8gcG9wdWxhdGUKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZVsscm5vcm1fcHJlZCA6PSBybm9ybSgxLCBtZWFuID0gcHJlZF9kaXNzaW0sIHNkID0gcHJlZF9zZSksLih5ZWFyLCBzdXJ2ZXlfdW5pdCldCiMyKSBDQUxDVUxBVEUgTElORUFSIE1PREVMIFRPIEVYVFJBQ1QgU1VSVkVZIFNQRUNJRklDIFRSRU5EIFZBTFVFUwogIGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1biA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGUpCgogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuIDwtIGRhdGEudGFibGUoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW4pJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blssdmFyIDo9IHJvd25hbWVzKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuKSRjb2VmZmljaWVudHMpXQogIAogICNsaW1pdCB0byBpbnRlcmFjdGlvbnMgb25seSAoY2hlY2sgdGhpcyBpZiB0aGVyZSBhcmUgYW55IG1vZGVsIGNoYW5nZXMhKSByb3cgMiBhbmQgcm93cyAzNDo2NAogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuW2MoMiwzNDo2NCksXQogIAogICNhZGp1c3Qgc3VydmV5IHVuaXQgbmFtZSBieSBkZWxldGluZyBiZWdpbm5pbmcgb2Ygc3RyaW5nCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bLHN1cnZleV91bml0IDo9IHN1YnN0cih2YXIsIDE3LCBzdHJfbGVuZ3RoKHZhcikpXVt2YXIgPT0gInllYXIiLHN1cnZleV91bml0IDo9ICJBSSJdCiAgCiAgI2NhbGN1bGF0ZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKICBBSV9lc3RpbWF0ZSA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blsxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuWzEsc3VydmV5X3VuaXRfY29lZmZpY2llbnQgOj0gQUlfZXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bMjozMixzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCA6PSAoQUlfZXN0aW1hdGUgKyBFc3RpbWF0ZSldCiAgCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucywgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bLC4oc3VydmV5X3VuaXQsIHN1cnZleV91bml0X2NvZWZmaWNpZW50KV0pCiAgCiAgcHJpbnQoaSkKfQogIAojcmVkdWNlIHRvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKHN1cnZleV91bml0X2NvZWZmaWNpZW50KSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSA8LSB1bmlxdWUocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zWywuKHN1cnZleV91bml0LCBtZWFuX2Rpc3NpbV9jb2VmLCBzZF9kaXNzaW0pXSkKCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gImZ1bGwiXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3ByZWRpY3Rpb25zIHdpdGggdGVtcCBoZWxkIGNvbnN0YW50IGFuZCBmaXNoaW5nIHN0aWxsIHZhcnlpbmcgZnJvbSB5ZWFyIHRvIHllYXIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3RhYmxlIHdpdGggcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiBhbGwgcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIChieSB5ZWFyKQp0YWJsZV9jb25zdGFudHRlbXAgPC0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXAgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZV9jb25zdGFudHRlbXBbLHJub3JtX3ByZWQgOj0gcm5vcm0oMSwgbWVhbiA9IHByZWRfZGlzc2ltLCBzZCA9IHByZWRfc2UpLC4oeWVhciwgc3VydmV5X3VuaXQpXQojMikgQ0FMQ1VMQVRFIExJTkVBUiBNT0RFTCBGT1IgU0xPUEUgVkFMVUVTCiAgamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcCA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGVfY29uc3RhbnR0ZW1wKQoKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXAgPC0gZGF0YS50YWJsZShzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXApJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBbLHZhciA6PSByb3duYW1lcyhzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXApJGNvZWZmaWNpZW50cyldCiAgCiAgI2xpbWl0IHRvIGludGVyYWN0aW9ucyBvbmx5IChjaGVjayB0aGlzIGlmIHRoZXJlIGFyZSBhbnkgbW9kZWwgY2hhbmdlcyEpIHJvdyAyIGFuZCByb3dzIDM0OjY0CiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFtjKDIsMzQ6NjQpLF0KICAKICAjYWRqdXN0IHN1cnZleSB1bml0IG5hbWUgYnkgZGVsZXRpbmcgYmVnaW5uaW5nIG9mIHN0cmluZwogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFssc3VydmV5X3VuaXQgOj0gc3Vic3RyKHZhciwgMTcsIHN0cl9sZW5ndGgodmFyKSldW3ZhciA9PSAieWVhciIsc3VydmV5X3VuaXQgOj0gIkFJIl0KICAKICAjY2FsY3VsYXRlIGludGVyYWN0aW9uIGNvZWZmaWNpZW50cwogIEFJX2VzdGltYXRlIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsxLHN1cnZleV91bml0X2NvZWZmaWNpZW50IDo9IEFJX2VzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsyOjMyLHN1cnZleV91bml0X2NvZWZmaWNpZW50IDo9IChBSV9lc3RpbWF0ZSArIEVzdGltYXRlKV0KICAKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnR0ZW1wIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXAsIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFssLihzdXJ2ZXlfdW5pdCwgc3VydmV5X3VuaXRfY29lZmZpY2llbnQpXSkKICAKICBwcmludChpKQp9CiAgCiNyZWR1Y2UgdG8gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKHN1cnZleV91bml0X2NvZWZmaWNpZW50KSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wLnN1bW1hcnkgPC0gdW5pcXVlKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBbLC4oc3VydmV5X3VuaXQsIG1lYW5fZGlzc2ltX2NvZWYsIHNkX2Rpc3NpbSldKQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcC5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gInRlbXBfY29uc3RhbnQiXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnkgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnksIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXAuc3VtbWFyeSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiNwcmVkaWN0aW9ucyB3aXRoIGZpc2hpbmcgaGVsZCBjb25zdGFudCAoYW5kIHRlbXBlcmF0dXJlIHZhcnlpbmcpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGVfY29uc3RhbnRmaXNoaW5nIDwtIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZ1ssLihzdXJ2ZXlfdW5pdCwgcHJlZF9kaXNzaW0sIHByZWRfc2UsIHllYXIpXQojMCkgbWFrZSBkYXRhdGFibGUgdG8gcG9wdWxhdGUKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nIDwtIGRhdGEudGFibGUoKQojMSkgTkVXIFBSRURJQ1RFRCBWQUxVRVMgRlJPTSBESVNUUklCVVRJT04KZm9yIChpIGluIDE6MTAwMCl7CiAgdGFibGVfY29uc3RhbnRmaXNoaW5nWyxybm9ybV9wcmVkIDo9IHJub3JtKDEsIG1lYW4gPSBwcmVkX2Rpc3NpbSwgc2QgPSBwcmVkX3NlKSwuKHllYXIsIHN1cnZleV91bml0KV0KIzIpIENBTENVTEFURSBMSU5FQVIgTU9ERUwgRk9SIFNMT1BFIFZBTFVFUwogIGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmcgPC0gbG0ocm5vcm1fcHJlZCB+IHllYXIqc3VydmV5X3VuaXQsZGF0YSA9IHRhYmxlX2NvbnN0YW50ZmlzaGluZykKCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nIDwtIGRhdGEudGFibGUoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nKSRjb2VmZmljaWVudHMpCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nWyx2YXIgOj0gcm93bmFtZXMoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nKSRjb2VmZmljaWVudHMpXQogIAogICNsaW1pdCB0byBpbnRlcmFjdGlvbnMgb25seSAoY2hlY2sgdGhpcyBpZiB0aGVyZSBhcmUgYW55IG1vZGVsIGNoYW5nZXMhKSByb3cgMiBhbmQgcm93cyAzNDo2NAogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZyA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbYygyLDM0OjY0KSxdCiAgCiAgI2FkanVzdCBzdXJ2ZXkgdW5pdCBuYW1lIGJ5IGRlbGV0aW5nIGJlZ2lubmluZyBvZiBzdHJpbmcKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbLHN1cnZleV91bml0IDo9IHN1YnN0cih2YXIsIDE3LCBzdHJfbGVuZ3RoKHZhcikpXVt2YXIgPT0gInllYXIiLHN1cnZleV91bml0IDo9ICJBSSJdCiAgCiAgI2NhbGN1bGF0ZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKICBBSV9lc3RpbWF0ZSA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMSxFc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMSxzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCA6PSBBSV9lc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMjozMixzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCA6PSAoQUlfZXN0aW1hdGUgKyBFc3RpbWF0ZSldCiAgCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50ZmlzaGluZyA8LSByYmluZChwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nLCBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbLC4oc3VydmV5X3VuaXQsIHN1cnZleV91bml0X2NvZWZmaWNpZW50KV0pCiAgCiAgcHJpbnQoaSkKfQogIAojcmVkdWNlIHRvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nWyxtZWFuX2Rpc3NpbV9jb2VmOj0gbWVhbihzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCksc3VydmV5X3VuaXRdWyxzZF9kaXNzaW0gOj0gc2Qoc3VydmV5X3VuaXRfY29lZmZpY2llbnQpLC4oc3VydmV5X3VuaXQpXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfZmlzaGluZy5zdW1tYXJ5IDwtIHVuaXF1ZShwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nWywuKHN1cnZleV91bml0LCBtZWFuX2Rpc3NpbV9jb2VmLCBzZF9kaXNzaW0pXSkKCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X2Zpc2hpbmcuc3VtbWFyeVsscHJlZF90eXBlIDo9ICJmaXNoaW5nX2NvbnN0YW50Il0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5IDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5LCBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF9maXNoaW5nLnN1bW1hcnkpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3ByZWRpY3Rpb25zIHdpdGggYm90aCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSBoZWxkIGNvbnN0YW50ICh2YXJpYWJpbGl0eSBnb2VzIHRvIG90aGVyIGZhY3RvcnMgd2UgZG9uJ3QgYWNjb3VudCBmb3IpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nIDwtIGRhdGEudGFibGUoKQojMSkgTkVXIFBSRURJQ1RFRCBWQUxVRVMgRlJPTSBESVNUUklCVVRJT04KZm9yIChpIGluIDE6MTAwMCl7CiAgdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZ1sscm5vcm1fcHJlZCA6PSBybm9ybSgxLCBtZWFuID0gcHJlZF9kaXNzaW0sIHNkID0gcHJlZF9zZSksLih5ZWFyLCBzdXJ2ZXlfdW5pdCldCiMyKSBDQUxDVUxBVEUgTElORUFSIE1PREVMIEZPUiBTTE9QRSBWQUxVRVMKICBqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZykKCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBkYXRhLnRhYmxlKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmcpJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWyx2YXIgOj0gcm93bmFtZXMoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZykkY29lZmZpY2llbnRzKV0KICAKICAjbGltaXQgdG8gaW50ZXJhY3Rpb25zIG9ubHkgKGNoZWNrIHRoaXMgaWYgdGhlcmUgYXJlIGFueSBtb2RlbCBjaGFuZ2VzISkgcm93IDIgYW5kIHJvd3MgMzQ6NjQKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbYygyLDM0OjY0KSxdCiAgCiAgI2FkanVzdCBzdXJ2ZXkgdW5pdCBuYW1lIGJ5IGRlbGV0aW5nIGJlZ2lubmluZyBvZiBzdHJpbmcKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWyxzdXJ2ZXlfdW5pdCA6PSBzdWJzdHIodmFyLCAxNywgc3RyX2xlbmd0aCh2YXIpKV1bdmFyID09ICJ5ZWFyIixzdXJ2ZXlfdW5pdCA6PSAiQUkiXQogIAogICNjYWxjdWxhdGUgaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzCiAgQUlfZXN0aW1hdGUgPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZ1sxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbMSxzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCA6PSBBSV9lc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWzI6MzIsc3VydmV5X3VuaXRfY29lZmZpY2llbnQgOj0gKEFJX2VzdGltYXRlICsgRXN0aW1hdGUpXQogIAogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nLCBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWywuKHN1cnZleV91bml0LCBzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCldKQogIAogIHByaW50KGkpCn0KICAKI3JlZHVjZSB0byBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24KcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcGZpc2hpbmdbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKHN1cnZleV91bml0X2NvZWZmaWNpZW50KSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wZmlzaGluZy5zdW1tYXJ5IDwtIHVuaXF1ZShwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnR0ZW1wZmlzaGluZ1ssLihzdXJ2ZXlfdW5pdCwgbWVhbl9kaXNzaW1fY29lZiwgc2RfZGlzc2ltKV0pCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wZmlzaGluZy5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gImZpc2hpbmdfYW5kX3RlbXBfY29uc3RhbnQiXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnkgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnksIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXBmaXNoaW5nLnN1bW1hcnkpCmBgYAoKUGxvdHRpbmcgb2JzZXJ2ZWQgdnMgcHJlZGljdGVkCmBgYHtyfQoKamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0IDwtIGphY2NhcmRfdG90YWxfY29lZnMucltwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSwgb24gPSAic3VydmV5X3VuaXQiXQoKamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0WyxwcmVkX2xvd2VyIDo9IG1lYW5fZGlzc2ltX2NvZWYtc2RfZGlzc2ltXVsscHJlZF91cHBlciA6PSBtZWFuX2Rpc3NpbV9jb2VmK3NkX2Rpc3NpbV0KCiNGVUxMIE1PREVMLCBib3RoIHRlbXBlcmF0dXJlIGFuZCBmaXNoaW5nIGFyZSBhbGxvd2VkIHRvIHZhcnkKamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtIDwtIGxtKHN1cnZleV91bml0X2NvZWZmaWNpZW50IH4gbWVhbl9kaXNzaW1fY29lZiwgZGF0YSA9IGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZ1bGwiXSkKc3VtbWFyeShqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0pICNSXjIgMC40MgoKKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCA8LSBnZ3Bsb3QoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZnVsbCJdKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeCA9IG1lYW5fZGlzc2ltX2NvZWYsIHltaW4gPSBsd3IsIHltYXggPSB1cHIpLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4bWluID0gbWVhbl9kaXNzaW1fY29lZi1zZF9kaXNzaW0sIHhtYXggPSBtZWFuX2Rpc3NpbV9jb2VmK3NkX2Rpc3NpbSksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpLCBjb2xvciA9ICJkYXJrZ3JleSIsbGluZXR5cGUgPSAiZG90dGVkIiwgbWV0aG9kID0gImxtIikgKwogIGdlb21fYWJsaW5lKGFlcyhzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApKSArCiAgbGltcyh4ID0gYyhtaW4oamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfbG93ZXIpLG1heChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF91cHBlcikpKSArCiAgbGFicyh5ID0gIk9ic2VydmVkIM6yLWRpdmVyc2l0eSB0cmVuZCIseCA9ICJQcmVkaWN0ZWQgzrItZGl2ZXJzaXR5IHRyZW5kXG4iKSArCiAgdGhlbWVfY2xhc3NpYygpCikKCiNmaXNoaW5nIGNvbnN0YW50IChmaXNoaW5nIGNvbnN0YW50OyB0ZW1wZXJhdHVyZSB2YXJpZXMgb25seSkKamFjY2FyZF9maXNoaW5nX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSA8LSBsbShzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCB+IG1lYW5fZGlzc2ltX2NvZWYsIGRhdGEgPSBqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmaXNoaW5nX2NvbnN0YW50Il0pCnN1bW1hcnkoamFjY2FyZF9maXNoaW5nX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSkgCiNUZW1wZXJhdHVyZSBhcyBhIHByZWRpY3Rvciwgbm90IGZpc2hpbmcgPSBSXjIgPSAwLjI4IChkcm9wIGluIDEyJSBvZiB2YXJpYW5jZSBleHBsYWluZWQgd2hlbiB5b3UgbG9zZSBmaXNoaW5nIGFzIHByZWRpY3RvcikKCihqYWNjYXJkX2Zpc2hpbmdfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkIDwtIGdncGxvdChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmaXNoaW5nX2NvbnN0YW50Il0pICsKZ2VvbV9lcnJvcmJhcihhZXMoeCA9IG1lYW5fZGlzc2ltX2NvZWYsIHltaW4gPSBsd3IsIHltYXggPSB1cHIpLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4bWluID0gbWVhbl9kaXNzaW1fY29lZi1zZF9kaXNzaW0sIHhtYXggPSBtZWFuX2Rpc3NpbV9jb2VmK3NkX2Rpc3NpbSksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpKSArCiAgICBnZW9tX3Ntb290aChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4ID0gbWVhbl9kaXNzaW1fY29lZiksIGNvbG9yID0gImRhcmtncmV5IixsaW5ldHlwZSA9ICJkb3R0ZWQiLCBtZXRob2QgPSAibG0iKSArCiAgZ2VvbV9hYmxpbmUoYWVzKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkpICsKICAgICAgbGltcyh4ID0gYyhtaW4oamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfbG93ZXIpLG1heChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF91cHBlcikpKSArCiAgbGFicyh5ID0gIk9ic2VydmVkIM6yLWRpdmVyc2l0eSB0cmVuZCIseCA9ICJQcmVkaWN0ZWQgzrItZGl2ZXJzaXR5IHRyZW5kXG4odGVtcGVyYXR1cmUgdmFyaWVzIGZpc2hpbmcgY29uc3RhbnQpIikgKwogIHRoZW1lX2NsYXNzaWMoKQopCgojdGVtcCBjb25zdGFudCAoZmlzaGluZyBvbmx5OyB0ZW1wZXJhdHVyZSBjb25zdGFudCkKamFjY2FyZF90ZW1wZXJhdHVyZV9jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0gPC0gbG0oc3VydmV5X3VuaXRfY29lZmZpY2llbnQgfiBtZWFuX2Rpc3NpbV9jb2VmLCBkYXRhID0gamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAidGVtcF9jb25zdGFudCJdKQpzdW1tYXJ5KGphY2NhcmRfdGVtcGVyYXR1cmVfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtKSAjMC4xOCBEcm9wIGluIDIyJSBvZiB2YXJpYW5jZSBleHBsYWluZWQgd2hlbiB5b3UgbG9zZSB0ZW1wZXJhdHVyZSBhcyBhIHByZWRpY3RvcgoKKGphY2NhcmRfdGVtcGVyYXR1cmVfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkIDwtIGdncGxvdChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJ0ZW1wX2NvbnN0YW50Il0pICsKICBnZW9tX2Vycm9yYmFyKGFlcyh4ID0gbWVhbl9kaXNzaW1fY29lZiwgeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh5ID0gc3VydmV5X3VuaXRfY29lZmZpY2llbnQsIHhtaW4gPSBtZWFuX2Rpc3NpbV9jb2VmLXNkX2Rpc3NpbSwgeG1heCA9IG1lYW5fZGlzc2ltX2NvZWYrc2RfZGlzc2ltKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4ID0gbWVhbl9kaXNzaW1fY29lZikpICsKICAgIGdlb21fc21vb3RoKGFlcyh5ID0gc3VydmV5X3VuaXRfY29lZmZpY2llbnQsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSwgY29sb3IgPSAiZGFya2dyZXkiLGxpbmV0eXBlID0gImRvdHRlZCIsIG1ldGhvZCA9ICJsbSIpICsKICBnZW9tX2FibGluZShhZXMoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSkgKwogICAgICBsaW1zKHggPSBjKG1pbihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF9sb3dlciksbWF4KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX3VwcGVyKSkpICsKICBsYWJzKHkgPSAiT2JzZXJ2ZWQgzrItZGl2ZXJzaXR5IHRyZW5kIix4ID0gIlByZWRpY3RlZCDOsi1kaXZlcnNpdHkgdHJlbmRcbihmaXNoaW5nIHZhcmllcyB0ZW1wZXJhdHVyZSBjb25zdGFudCkiKSArCiAgdGhlbWVfY2xhc3NpYygpCikKCiNib3RoIHRlbXBlcmF0dXJlIGFuZCBmaXNoIGhlbGQgY29uc3RhbnQKamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX3RlbXBmaXNoY29uc3RhbnRpbnN1cnZleV9sbSA8LSBsbShzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCB+IG1lYW5fZGlzc2ltX2NvZWYsIGRhdGEgPSBqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmaXNoaW5nX2FuZF90ZW1wX2NvbnN0YW50Il0pCnN1bW1hcnkoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX3RlbXBmaXNoY29uc3RhbnRpbnN1cnZleV9sbSkgIyUxMSAKCihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfdGVtcGZpc2hjb25zdGFudGluc3VydmV5IDwtIGdncGxvdChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmaXNoaW5nX2FuZF90ZW1wX2NvbnN0YW50Il0pICsKZ2VvbV9lcnJvcmJhcihhZXMoeCA9IG1lYW5fZGlzc2ltX2NvZWYsIHltaW4gPSBsd3IsIHltYXggPSB1cHIpLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4bWluID0gbWVhbl9kaXNzaW1fY29lZi1zZF9kaXNzaW0sIHhtYXggPSBtZWFuX2Rpc3NpbV9jb2VmK3NkX2Rpc3NpbSksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBzdXJ2ZXlfdW5pdF9jb2VmZmljaWVudCwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpKSArCiAgICBnZW9tX3Ntb290aChhZXMoeSA9IHN1cnZleV91bml0X2NvZWZmaWNpZW50LCB4ID0gbWVhbl9kaXNzaW1fY29lZiksIGNvbG9yID0gImRhcmtncmV5IixsaW5ldHlwZSA9ICJkb3R0ZWQiLCBtZXRob2QgPSAibG0iKSsKICBnZW9tX2FibGluZShhZXMoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSkgKwogICAgICBsaW1zKHggPSBjKG1pbihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF9sb3dlciksbWF4KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX3VwcGVyKSkpICsKICBsYWJzKHkgPSAiT2JzZXJ2ZWQgzrItZGl2ZXJzaXR5IHRyZW5kIix4ID0gIlByZWRpY3RlZCDOsi1kaXZlcnNpdHkgdHJlbmRcbihmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSBjb25zdGFudCkiKSArCiAgdGhlbWVfY2xhc3NpYygpCikKCgojbWVyZ2UKamFjY2FyZF9maXNoaW5nX3NidF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbWVyZ2UgPC0gcGxvdF9ncmlkKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwwLjMsMC4xLDAuMSksImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkX2Zpc2hpbmdfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLDAuMywwLjEsMC4xKSwiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphY2NhcmRfdGVtcGVyYXR1cmVfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLDAuMywwLjEsMC4xKSwiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF90ZW1wZmlzaGNvbnN0YW50aW5zdXJ2ZXkgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjEsMC4zLDAuMSwwLjEpLCJjbSIpKSwgbmNvbCA9IDIsIGxhYmVscyA9IGMoImEuIiwiYi4iLCJjLiIsImQuIikpCgpnZ3NhdmUoamFjY2FyZF9maXNoaW5nX3NidF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbWVyZ2UsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksZmlsZW5hbWUgPSAiamFjY2FyZF9maXNoaW5nX3NidF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbWVyZ2UuanBnIiwgaGVpZ2h0ID02LCB3aWR0aCA9IDgpCgoKYGBgCgpMZXQncyB2aXN1YWxpemUgbW9kZWwgY29lZmZpY2llbnRzIHdpdGggdGVtcGVyYXR1cmUgYW5kIGZpc2hpbmcgKHNpbWlsYXIgdG8gZmlndXJlIDIpCm1vZGVsX2F2Z192YWx1ZXMKYGBge3J9Cm1vZGVsX2F2Z192YWx1ZXMKCiNjb3ZhcmlhbmNlIG1hdHJpeApjb3ZfbSA8LSB2Y292KG1vZGVsX2F2Z19kZWx0YTQpCgojZXh0cmFjdCBjb2VmZmljaWVudHMKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYgPC0gbW9kZWxfYXZnX3ZhbHVlc1tjKDcsMzk6MTAxKSwuKGNvZWZfbmFtZSwgY29lZiwgc2UpXQoKI2ludGVyYWN0aW9uIHN0YW5kYXJkIGVycm9yID0gc3FydCh2YXIoYjEpICsgdmFyKGIyKSArIDJjb3YoYjF+YjIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc3FydCh2YXIoc3VtbWVkX3Rvbm5lcyBTRV4yKSArIHZhcihBbGV1dGlhbiBJc2xhbmRzIFNFXjIpICsgMmNvdihzdW1tZWRfdG9ubmVzIH4gaW50ZXJjZXB0ICgtOC4xMzE3MjJlLTAzKSkpCgojaW5zZXJ0IEFJIHZhbHVlcwppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlsxOjIsc3VydmV5X3VuaXQgOj0gIkFJIl1bMToyLGNvZWZfdHJ1ZSA6PSBjb2VmXVsxOjIscHJlZGljdG9yIDo9IGMoIlJlbGF0aXZlIGZpc2hpbmcgY2F0Y2giLCJNaW5pbXVtIHRlbXBlcmF0dXJlIildCgojT3RoZXIgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKGVkaXQgYm90aCBjb2VmZmljaWVudCBhbmQgKQppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlszOjMzLHN1cnZleV91bml0IDo9IHN1YnN0cihjb2VmX25hbWUsIDM5LCBzdHJfbGVuZ3RoKGNvZWZfbmFtZSkpXQppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlszOjMzLGNvZWZfdHJ1ZSA6PSBpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlsxLGNvZWZfdHJ1ZV0rY29lZl0KaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbMzozMyxwcmVkaWN0b3IgOj0gIlJlbGF0aXZlIGZpc2hpbmcgY2F0Y2giXQoKI090aGVyIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmWzM0OjY0LHN1cnZleV91bml0IDo9IHN1YnN0cihjb2VmX25hbWUsIHN0cl9sZW5ndGgoInN1cnZleV91bml0IikrMSwgc3RyX2xlbmd0aChjb2VmX25hbWUpLXN0cl9sZW5ndGgoInllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIiktMSldWzM0OjY0LGNvZWZfdHJ1ZSA6PSBpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlsyLGNvZWZfdHJ1ZV0rY29lZl1bMzQ6NjQscHJlZGljdG9yIDo9ICJNaW5pbXVtIHRlbXBlcmF0dXJlIl0KCiNyZW9yZGVyIHRlbXBlcmF0dXJlIGFuZCBmaXNoaW5nCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmWyxwcmVkaWN0b3IgOj0gZmFjdG9yKHByZWRpY3RvciwgbGV2ZWxzID0gYygiTWluaW11bSB0ZW1wZXJhdHVyZSIsIlJlbGF0aXZlIGZpc2hpbmcgY2F0Y2giKSldCgojbGluayBmb3IgZnVsbCBzdXJ2ZXkgbmFtZQppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiA8LSBjb2xvcl9saW5rW2ludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmLCBvbiA9ICJzdXJ2ZXlfdW5pdCJdCgojcmVvcmRlciBieSBzdXJ2ZXlfdW5pdAppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlssU3VydmV5X05hbWVfU2Vhc29uIDo9IHJlb3JkZXIoU3VydmV5X05hbWVfU2Vhc29uLCBzdXJ2ZXlfdW5pdCwgZGVjcmVhc2luZyA9IFRSVUUpXQoKI21hcmsgc2lnbmlmaWNhbmNlCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmWyxTaWduaWZpY2FudCA6PSBpZmVsc2UoKGNvZWZfdHJ1ZS1zZSA+IDAgJiBjb2VmX3RydWUrc2UgPiAwKSB8IChjb2VmX3RydWUtc2UgPCAwICYgY29lZl90cnVlK3NlIDwgMCksVCxGKV0KCgojUGxvdCBib3RoCnNidF9maXNoaW5nX2F2Z19tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCmdlb21fcG9pbnQoZGF0YSA9IGludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmLCBhZXMoeCA9IFN1cnZleV9OYW1lX1NlYXNvbiwgeSA9IGNvZWZfdHJ1ZSwgY29sb3IgPSBTaWduaWZpY2FudCkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiwgYWVzKHggPSBTdXJ2ZXlfTmFtZV9TZWFzb24sIHltaW4gPSBjb2VmX3RydWUtc2UsIHltYXggPSBjb2VmX3RydWUrc2UsIGNvbG9yID0gU2lnbmlmaWNhbnQpLCB3aWR0aCA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2dyZXkiLCJibGFjayIpKSArCmZhY2V0X3dyYXAofnByZWRpY3Rvciwgc2NhbGVzID0gImZyZWVfeCIpICsKc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKICBsYWJzKHkgPSAiQ29lZmZpY2llbnQiLCB4ID0gIiIpICsKY29vcmRfZmxpcCgpICsKdGhlbWVfY2xhc3NpYygpCiAgCgoKYGBgClBsb3QgYWxsIG90aGVyIGNvZWZmaWNpZW50cyBpbiBhdmVyYWdlZCBtb2RlbApgYGB7cn0KbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wIDwtIG1vZGVsX2F2Z192YWx1ZXNbYygyLDYsMTAyOjEwNiksXQoKI21hcmsgc2lnbmlmaWNhbmNlCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssU2lnbmlmaWNhbnQgOj0gaWZlbHNlKChjb2VmLXNlID4gMCAmIGNvZWYrc2UgPiAwKSB8IChjb2VmLXNlIDwgMCAmIGNvZWYrc2UgPCAwKSxULEYpXQoKI21vcmUgaGVscGZ1bCBuYW1lcyBmb3IgdmFyaWFibGVzCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssVmFyaWFibGUgOj0gYygiQXJlYSIsIlNwZWNpZXMgY291bnQiLCJEZXB0aCIsIk51bWJlciBvZiB0b3dzIiwiTGF0aXR1ZGUiLCJEZXB0aCByYW5nZSIsIkxhdGl0dWRlIHJhbmdlIildCgojbWFrZSBmYWN0b3Igd2l0aCBvcmRlcgptb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbLFZhcmlhYmxlIDo9IGZhY3RvcihWYXJpYWJsZSwgbGV2ZWxzID0gYygiQXJlYSIsIlNwZWNpZXMgY291bnQiLCJOdW1iZXIgb2YgdG93cyIsIkRlcHRoIiwiRGVwdGggcmFuZ2UiLCJMYXRpdHVkZSIsIkxhdGl0dWRlIHJhbmdlIikpXQoKCiNwbG90CmFsbF9hdmdfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArIApnZW9tX3BvaW50KGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXAsIGFlcyh4ID0gVmFyaWFibGUsIHkgPSBjb2VmLCBjb2xvciA9IFNpZ25pZmljYW50KSkgKyAgCmdlb21fZXJyb3JiYXIoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcCwgYWVzKHggPSBWYXJpYWJsZSwgeW1pbiA9IGNvZWYtc2UsIHltYXggPSBjb2VmK3NlLCBjb2xvciA9IFNpZ25pZmljYW50KSwgd2lkdGggPSAwKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtncmV5IiwiYmxhY2siKSkgKwpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCnNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAgbGFicyh5ID0gIkNvZWZmaWNpZW50IiwgeCA9ICJcblxuXG4iKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKYWxsX2J1dF9sYXRfYXZnX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKyAKZ2VvbV9wb2ludChkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlID09ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5ID0gY29lZiwgY29sb3IgPSBTaWduaWZpY2FudCkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbVmFyaWFibGUgPT0gIkxhdGl0dWRlIl0sIGFlcyh4ID0gVmFyaWFibGUsIHltaW4gPSBjb2VmLXNlLCB5bWF4ID0gY29lZitzZSwgY29sb3IgPSBTaWduaWZpY2FudCksIHdpZHRoID0gMCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrZ3JleSIsImJsYWNrIikpICsKZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwpzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwogIGxhYnMoeSA9ICJDb2VmZmljaWVudCIsIHggPSAiTW9kZWwgdmFyaWFibGUiKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKbGF0X2F2Z19tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsgCmdlb21fcG9pbnQoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFtWYXJpYWJsZSAhPSAiTGF0aXR1ZGUiXSwgYWVzKHggPSBWYXJpYWJsZSwgeSA9IGNvZWYsIGNvbG9yID0gU2lnbmlmaWNhbnQpKSArICAKZ2VvbV9lcnJvcmJhcihkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlICE9ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5bWluID0gY29lZi1zZSwgeW1heCA9IGNvZWYrc2UsIGNvbG9yID0gU2lnbmlmaWNhbnQpLCB3aWR0aCA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2dyZXkiLCJibGFjayIpKSArCmdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKICBsYWJzKHkgPSAiQ29lZmZpY2llbnQiLCB4ID0gIk1vZGVsIHZhcmlhYmxlIikgKwpjb29yZF9mbGlwKCkgKwp0aGVtZV9jbGFzc2ljKCkKCiNtZXJnZSBpbnRvIHNpbmdsZSBwbG90Cgptb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQgPC0gY293cGxvdDo6cGxvdF9ncmlkKHNidF9maXNoaW5nX2F2Z19tb2RlbF9jb2VmK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJudWxsIiwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSxhbGxfYXZnX21vZGVsX2NvZWYrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm51bGwiKSwgbmNvbCA9IDEsIGxhYmVscyA9IGMoIiAgYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLiIsIiAgICAgICAgYy4iKSwgbGFiZWxfeSA9IDAuOTksIHJlbF9oZWlnaHRzID0gYygzLDEpKQoKZ2dzYXZlKG1vZGVsX2NvZWZfc3VtbWFyeV9zYnRfamFjY2FyZCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJtb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQuanBnIiwgaGVpZ2h0ID0gNi41LCB3aWR0aCA9IDgsIHVuaXQgPSAiaW4iKQoKCmBgYAoKCiNTaG93IGludGVyY2VwdHMgYnkgcmVnaW9uIGFuZCBzZWFzb24KCmBgYHtyfQoKI3N1cnZleSBpbnRlcmNlcHRzCnN1cnZleV9pbnRlcmNlcHRzIDwtIG1vZGVsX2F2Z192YWx1ZXNbYygxLDg6MzgpLC4oY29lZl9uYW1lLCBjb2VmLCBzZSldCnN1cnZleV9pbnRlcmNlcHRzWzEsc3VydmV5X3VuaXQgOj0gIkFJIl1bMSxjb2VmX3RydWUgOj0gY29lZl0Kc3VydmV5X2ludGVyY2VwdHNbMjozMixzdXJ2ZXlfdW5pdCA6PSBzdWJzdHIoY29lZl9uYW1lLCAxMiwgc3RyX2xlbmd0aChjb2VmX25hbWUpKV1bMjozMixjb2VmX3RydWUgOj0gc3VydmV5X2ludGVyY2VwdHNbMSxjb2VmX3RydWVdK2NvZWZdCnN1cnZleV9pbnRlcmNlcHRzIDwtIGNvbG9yX2xpbmtbc3VydmV5X2ludGVyY2VwdHMsIG9uID0gInN1cnZleV91bml0Il0Kc3VydmV5X2ludGVyY2VwdHNbLFN1cnZleV9OYW1lX1NlYXNvbiA6PSByZW9yZGVyKFN1cnZleV9OYW1lX1NlYXNvbiwgY29lZl90cnVlKV0KCgojc2Vhc29uX2ludGVyY2VwdHMKc2Vhc29uX2ludGVyY2VwdHMgPC0gbW9kZWxfYXZnX3ZhbHVlc1tjKDEsMzo1KSwuKGNvZWZfbmFtZSwgY29lZiwgc2UpXQpzZWFzb25faW50ZXJjZXB0c1sxLHNlYXNvbiA6PSAiU3ByaW5nIl1bMSxjb2VmX3RydWUgOj0gY29lZl0Kc2Vhc29uX2ludGVyY2VwdHNbMjo0LHNlYXNvbiA6PSBzdWJzdHIoY29lZl9uYW1lLCA3LCBzdHJfbGVuZ3RoKGNvZWZfbmFtZSkpXVsyOjQsY29lZl90cnVlIDo9IHNlYXNvbl9pbnRlcmNlcHRzWzEsY29lZl90cnVlXStjb2VmXQpzZWFzb25faW50ZXJjZXB0c1ssc2Vhc29uIDo9IHJlb3JkZXIoc2Vhc29uLCBjb2VmX3RydWUpXQoKCiNzdXJ2ZXkgaW50ZXJjZXB0cwpzdXJ2ZXlfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArCmdlb21fcG9pbnQoZGF0YSA9IHN1cnZleV9pbnRlcmNlcHRzLCBhZXMoeCA9IFN1cnZleV9OYW1lX1NlYXNvbiwgeSA9IGNvZWZfdHJ1ZSkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBzdXJ2ZXlfaW50ZXJjZXB0cywgYWVzKHggPSBTdXJ2ZXlfTmFtZV9TZWFzb24sIHltaW4gPSBjb2VmX3RydWUtc2UsIHltYXggPSBjb2VmX3RydWUrc2UpLCB3aWR0aCA9IDApICsKc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKIyAgeWxpbSgwLjM1LDEpICsKICBsYWJzKHkgPSAiSW50ZXJjZXB0IiwgeCA9ICIiKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQogIAojc2Vhc29uIGludGVyY2VwdHMKc2Vhc29uX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKwpnZW9tX3BvaW50KGRhdGEgPSBzZWFzb25faW50ZXJjZXB0cywgYWVzKHggPSBzZWFzb24sIHkgPSBjb2VmX3RydWUpKSArICAKZ2VvbV9lcnJvcmJhcihkYXRhID0gc2Vhc29uX2ludGVyY2VwdHMsIGFlcyh4ID0gc2Vhc29uLCB5bWluID0gY29lZl90cnVlLXNlLCB5bWF4ID0gY29lZl90cnVlK3NlKSwgd2lkdGggPSAwKSArCnNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAjIHlsaW0oMC4zNSwxKSArCiAgbGFicyh5ID0gIkludGVyY2VwdCIsIHggPSAiIikgKwpjb29yZF9mbGlwKCkgKwp0aGVtZV9jbGFzc2ljKCkKCiNtZXJnZSBpbnRvIHNpbmdsZSBwbG90Cgptb2RlbF9pbnRlcmNlcHRfamFjY2FyZCA8LSBjb3dwbG90OjpwbG90X2dyaWQoc3VydmV5X21vZGVsX2NvZWYrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb25fbW9kZWxfY29lZiwgbmNvbCA9IDEsIGxhYmVscyA9IGMoImEuIiwiYi4iKSwgbGFiZWxfeSA9IDAuOTksIHJlbF9oZWlnaHRzID0gYygzLDEpLCBhbGlnbiA9ICJ2IikKCmdnc2F2ZShtb2RlbF9pbnRlcmNlcHRfamFjY2FyZCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJtb2RlbF9pbnRlcmNlcHRfamFjY2FyZC5qcGciLCBoZWlnaHQgPSA2LjUsIHdpZHRoID0gNi41LCB1bml0ID0gImluIikKCgoKYGBg